Как вы смотрите несколько файлов, но только запускаете задачу на измененном файле, в Grunt.js?
Изучая, как использовать grunt, я пытаюсь сделать простой кофеер script watcher/compiler. Проблема в том, что если я расскажу о задаче watch
для просмотра нескольких файлов, и один из них изменит, он передаст все файлы команде coffee
. Это означает, что когда вы меняете 1 файл, он собирается перекомпилировать все файлы, соответствующие шаблону src
. Вместо этого я хочу только перекомпилировать один измененный файл, соответствующий шаблону src
.
Вот grunt.js
:
module.exports = function(grunt) {
grunt.initConfig({
coffee: {
app: {
src: ['test/cases/controller/*.coffee'],
dest: 'tmp',
options: {
bare: true,
preserve_dirs: true
}
}
},
watch: {
files: ['<config:coffee.app.src>'],
tasks: ['coffee:app']
}
});
grunt.loadNpmTasks('grunt-coffee');
grunt.registerTask('default', 'coffee');
};
Это используется grunt-coffee, что в основном таково: https://gist.github.com/2373159.
Когда я запускаю grunt watch
, и я сохраняю файл в test/cases/controller/*.coffee
, он компилирует все соответствующие файлы (помещая их в tmp/*
).
Как вы вместо этого компилируете измененный файл с помощью grunt?
Ответы
Ответ 1
В предстоящем (и в настоящее время в разработке) v0.4.0a grunt есть объект grunt.file.watchFiles, который был специально разработан для этой цели. Возможно, плагин grunt-coffee может добавить поддержку этой функции, я не уверен.
В любом случае, если вы заинтересованы в попытке внедрения в проекте версии grunt в вашем проекте, посмотрите Когда я смогу использовать встроенную функцию "X" '? FAQ.
Ответ 2
Я получил эту работу при компиляции моих меньших файлов. Вы должны быть в состоянии немного приспособиться к этой конфигурации к git, работая с плагином coffeescript. Интересующая часть представляет собой grunt.event.on('watch', ...)
. В этом обработчике событий я обновляю свойство files
в команде less, чтобы содержать только измененный файл.
path = require('path');
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
less: {
development: {
options: {
paths: ["./library/less"],
},
files: [
{ src: "./library/less/bootstrap.less", dest: "./library/css/bootstrap.css"},
{ src: "./library/less/app.less", dest: "./library/css/app.css"}
]
}
},
watch: {
styles: {
files: "./library/less/*",
tasks: ["less"],
options: {
nospawn: true,
},
},
},
});
// Event handling
grunt.event.on('watch', function(action, filepath){
// Update the config to only build the changed less file.
grunt.config(['less', 'development', 'files'], [
{src: filepath, dest: './library/css/' + path.basename(filepath, '.less') + '.css'}
]);
});
// Load the plugins
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');
// Tasks
grunt.registerTask('default', ['watch']);
};
Ответ 3
Ни один из этих ответов не работал очень хорошо для меня. Вот мое решение, если кому-то интересно (я знаю, что я немного поздно отвечаю на этот вопрос).
https://gist.github.com/ryansmith94/8569178
Ответ 4
В этом issue Кайл Робинсон предлагает использовать событие watch
. Очень важно установить свойство watch t nospawn
на true
, чтобы он работал. Я изменил его решение для выборочного запуска задач:
grunt.event.on('watch', function(action, filepath) {
if (minimatch(filepath, grunt.config('watch.stylesheets.files'))) {
grunt.config('compass.dist.options.specify', [filepath]);
}
if (minimatch(filepath, grunt.config('watch.scripts.files'))) {
var uglifySrc = filepath.replace(grunt.config('uglify.dist.cwd'), '');
grunt.config('jshint.dist.src', [filepath]);
grunt.config('uglify.dist.src', [uglifySrc]);
}
});
Вот полное решение: https://gist.github.com/luissquall/5408257
Ответ 5
https://github.com/tschaub/grunt-newer выглядит точно для похожих задач:
Настроить задачи Grunt для запуска только с более новыми файлами.
Сводка: новая задача будет настраивать другую задачу для запуска с помощью src файлы, которые a) новее, чем файлы dest, или b) новее, чем последние успешный запуск (если нет файлов dest). См. Ниже примеры и более подробно.
Вы можете легко добавить любую задачу. В вашем случае:
grunt.loadNpmTasks('grunt-newer');
grunt.registerTask('default', 'newer:coffee');
Ответ 6
Итак, новый для Grunt 0.4 - больше именных задач
Приведем пример!
watch: {
package1: {
files: [
'./modules/package1/**/*.coffee'
],
tasks: ['coffee:package3']
},
package2: {
files: [
'./test_packages/package2/**/*.coffee'
],
tasks: ['coffee:package3']
},
package3: {
files: [
'./test_packages/package3/**/*.coffee'
],
tasks: ['coffee:package3']
},
}
Чтобы запустить все эти задачи, просто выполните grunt.registerTask('default', ['myInitialBuild', 'watch']);
Где myInitialBuild
- это какая-то начальная сборка (все файлы), а затем следуйте за ней с помощью часов на каждом пакете. На самом деле вы можете сделать это для каждого файла, но это звучит сочно.
Ответ 7
Задача grunt-contrib-watch теперь поддерживает это.
https://npmjs.org/package/grunt-contrib-watch → искать "Компиляция файлов по мере необходимости"
grunt.initConfig({
watch: {
scripts: {
files: ['lib/*.js'],
tasks: ['jshint'],
options: {
nospawn: true,
},
},
},
jshint: {
all: ['lib/*.js'],
},
});
// on watch events configure jshint:all to only run on changed file
grunt.event.on('watch', function(action, filepath) {
grunt.config(['jshint', 'all'], filepath);
});
Это должно помешать задачам компилировать все файлы каждый раз, когда что-то меняется.