2013-11-14 11 views
8

Utilizzando una versione di ciò che grunt-contrib-watch raccomanda per la compilazione solo cambiato i file qui: https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-neededCome compilare condizionale (usando Grunt) ha cambiato solo i file di giada con modello include

var changedFiles = Object.create(null); 

var onChange = grunt.util._.debounce(function() { 
grunt.config('jshint.all.src', Object.keys(changedFiles)); 
    changedFiles = Object.create(null); 
}, 200); 

grunt.event.on('watch', function(action, filepath) { 
    changedFiles[filepath] = action; 
    onChange(); 
}); 

Questo funziona bene (di nuovo con un variazione che ho scritto per qui: https://gist.github.com/pgilad/6897875)

Il problema è quando si utilizzainclude all'interno modelli giada, il che significa che sono inclusi altri modelli di Jade al fine di Bui ld il file html completo.

Utilizzando la soluzione singolare per la compilazione non funziona perché se un file .jade si sta lavorando è embeded utilizzando include current_working_jade.jade - il tra cui file di non andranno ricompilato.

Esistono soluzioni alternative per questo oltre la compilazione di tutti i file jade da zero? Questo causa un problema quando hai circa 60 file jade di grandi dimensioni da compilare ogni volta.

L'unica soluzione possibile mi viene in mente è o mappatura di giada modelli dipendenze esternamente o con le directory, ma io non conosco nessun strumenti/plugins che farlo ...

risposta

4

Dopo già iniziare a lavorare su un'impalcatura che genererà una giada sortof sourcemap Ho trovato questo grande progetto, che risolve già il problema:

Jade Inheritance

uso è il seguente:

  1. Installa pacchetto utilizzando: npm install jade-inheritance --save-dev
  2. Dove si desidera ottenere un elenco di file dipendenti da una giada:

    var JadeInheritance = require('jade-inheritance');

    var inheritance = new JadeInheritance(file, basedirname, {basedir:basedirname});

  3. Poi, quando si desidera ottenere il file:

    depenedentFiles = inheritance.files;

  4. Il progetto dimostra anche come applicare il concetto con grunt.watch al fine di compilare solo cambiato i file jade con i loro dipendenti, esattamente ciò di cui avevo bisogno:

Using jade-inheritance with grunt watch

+0

Può funzionare per cartelle multiple, i file ereditati mentre eseguiamo il debug non possiamo impostare come funziona, apprezzeremo il vostro aiuto :) –

1

immagino qualcosa come controllare tutti file jade e se includono il file modificato, ricompilare anche quello. Non dovrebbe essere troppo difficile. Pseudo codice:

var allFiles = getAllJadeFileWithIncludesAndProjectPathMap(); 
//allFiles now contains something like this 

{ 
    'jade/index.jade': ['jade/menu.jade', 'jade/home.jade'], 
    'jade/about.jade': ['jade/menu.jade'] 
} 


var rootFiles = []; 

_.each(allFiles, function (includes, parent) { 
    _.each(includes, function (includePath) { 
    var parent; 
    while (parent = getParentPath(includePath)) { 
     //nothing needed if getParentPath returns null for files that aren't included 
    } 

    if (rootFiles.indexOf(parent) !== -1) { 
     rootFiles.push(parent); 
    } 
    }); 
}); 

Ora aggiungere questi file all'attività di compilazione.

+0

Hmm, il 'getAllJadeFileWithIncludesAndProjectPathMap()' è in realtà quello che stavo cercando. Quindi in sostanza dopo aver ottenuto un evento 'changed' - lo trovo in' Array' e compilo 'jade' e tutti i suoi figli .. Non solo, ma stavo cercando una soluzione già esistente, e non volevo inventare la ruota da solo. –