2013-11-14 1 views
8

Используя версию того, что grunt-contrib-watch рекомендует для компиляции только измененных файлов здесь: https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-neededКак условно компилировать (с помощью Grunt) только измененной нефритовых файлы с шаблоном включает в себя

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

Это прекрасно работает (опять же с изменение я написал для него здесь: https://gist.github.com/pgilad/6897875)

проблема это при использовании include внутри шаблонов Jade, то есть вы в том числе другие шаблоны Джейд, чтобы Буй ld полный html-файл.

Используя сингулярное решение для компиляции не работает, потому что если .jade файл вы работаете в использовании include current_working_jade.jade поместить его - в том числе файл не будут перекомпилировать.

Существуют ли какие-либо обходные пути для этого кроме составителя всех ваших jade файлов с нуля? Это вызывает проблему, когда у вас есть около 60 больших нефритовых файлов для компиляции каждый раз.

Единственное возможное решение я могу думать о том, либо отображение нефрита шаблоны зависимостей либо внешне, либо с каталогами, но я не знаю, какие инструменты/плагины, которые делают, что ...

ответ

4

После уже начинают работать на помосте, который будет генерировать sortof нефрит sourcemap я нашел этот большой проект, который уже решает эту проблему:

Jade Inheritance

Использование выглядит следующим образом:

  1. Установите пакет, используя: npm install jade-inheritance --save-dev
  2. Где вы хотите получить список зависимых файлов от нефрита:

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

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

  3. Затем, когда вы хотите, чтобы получить файл:

    depenedentFiles = inheritance.files;

  4. Проект также демонстрирует, как применить концепцию с grunt.watch для того, чтобы компилировать только изменил jade файлы со своими иждивенцами, именно то, что мне было нужно:

Using jade-inheritance with grunt watch

+0

Может ли эта работа для многостраничной папки, унаследованных файлов при ее отладке, которую мы не можем установить, поскольку она работает, по достоинству оценят вашу помощь :) –

1

я представляю себе что-то вроде проверки всех jade-файлы, и если они включают ваш измененный файл, то перекомпилируйте это также. Не должно быть слишком сложно. Псевдокод:

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

Теперь добавьте эти файлы в задачу компиляции.

+0

Хм, то 'getAllJadeFileWithIncludesAndProjectPathMap()' на самом деле то, что я искал. Таким образом, в основном после получения «измененного» события - я нахожу его в «Array» и компилирую «jade» и все его дети. Не только это, но я искал уже существующее решение и не хотел изобретать колесо самостоятельно. –