2013-11-14 11 views
8

Mit einer Version enthält, was für die Erstellung grunt-contrib-watch empfiehlt geändert nur Dateien in hier: https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-neededWie bedingt zu kompilieren (mit Grunt) nur Jade Dateien geändert mit Vorlage

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(); 
}); 

Dies funktioniert gut (wieder mit einem Variation schrieb ich es hier für: https://gist.github.com/pgilad/6897875)

Das Problem ist, wenn include innerhalb Jade-Vorlagen verwenden, das heißt, Sie sind mit anderen Jade-Vorlagen, um bui ld die komplette HTML-Datei.

die einzigartige Lösung für die Kompilierung Verwendung nicht, weil nicht funktioniert, wenn eine .jade Datei, die Sie arbeiten an embeded ist include current_working_jade.jade mit - die einschließlich Datei nicht neu kompiliert bekommen.

Gibt es Abhilfen für dieses neben alle Ihre jade Dateien von Grund auf neu kompilieren? Dies verursacht ein Problem, wenn Sie etwa 60 große Jade-Dateien haben, die jedes Mal kompiliert werden müssen.

Die einzig mögliche Lösung, die ich denken kann, ist entweder Mapping Jade Vorlagen Abhängigkeiten entweder extern oder mit Verzeichnissen, aber ich kenne keine Tools/Plugins, die das tun ...

Antwort

4

Nachdem bereits auf einem Gerüst zu arbeiten beginnen, die eine sortof Jade generieren sourcemap ich dieses große Projekt gefunden, das bereits dieses Problem löst:

Jade Inheritance

Verwendung ist wie folgt:

  1. Installieren Sie das Paket mit: npm install jade-inheritance --save-dev
  2. Wo möchten Sie eine Liste der abhängigen Dateien von einer Jade erhalten:

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

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

  3. Dann, wenn Sie die Datei erhalten:

    depenedentFiles = inheritance.files;

  4. Das Projekt zeigt auch, wie das Konzept anzuwenden mit grunt.watch, um nur zu kompilieren geändert jade Dateien mit ihren Angehörigen, genau das, was ich brauchte:

Using jade-inheritance with grunt watch

+0

Kann dies für Multi-Ordner, vererbte Dateien arbeiten, wie wir es debuggen können wir nicht einstellen, wie es funktioniert, werden Ihre Hilfe zu schätzen :) –

1

ich so etwas wie die Überprüfung aller vorstellen Jade-Dateien und wenn sie Ihre geänderte Datei enthalten, dann rekompilieren Sie diese ebenfalls. Sollte nicht zu schwer sein. Pseudocode:

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); 
    } 
    }); 
}); 

Fügen Sie diese Dateien jetzt der Kompilieraufgabe hinzu.

+0

Hmm, das 'getAllJadeFileWithIncludesAndProjectPathMap()' ist eigentlich das, was ich suchte. Also im Grunde, nachdem ich ein "verändertes" Ereignis bekommen habe - ich finde es im 'Array' und kompiliere das' Jade' und all seine Kinder .. Nicht nur das, sondern ich suchte nach einer bereits existierenden Lösung und wollte nicht das Rad selbst erfinden. –