我的项目有300多个CoffeeScript文件,所以重新编译所有文件需要几秒钟的时间。我只想重新编译更改后的CoffeeScript文件。
这是我迄今为止最接近的一次,但"前端src/coffeescript"文件夹结构正在从src目录复制到dest目录。
coffee: {
changed: {
expand: true,
cwd: './',
src: ['<%= grunt.regarde.changed %>'],
dest: 'public/js/',
ext: '.js'
}
},
regarde: {
coffee: {
files: 'frontend-src/coffeescript/**/*.coffee',
tasks: ['coffee:changed', 'livereload']
}
}
这就是Grunt 0.4.0的全部内容。如有任何帮助,我们将不胜感激!
我自己也遇到过这个问题,受到对这个问题的评论的启发,我想出了一个解决方案:https://github.com/gruntjs/grunt-contrib-watch/issues/14
它实际上是用于grunt-controb手表插件的,但它也应该适用于grunt-regarde,因为它有类似的事件。
这个想法是绑定一个回调watch
事件,在该事件中,您将一个新任务添加到带有更改文件路径的grunt配置中,然后运行它
来自我的Gruntfile.coffee
:
coffee:
app:
expand: true
cwd: 'app/'
src: ['*.coffee',"**/*.coffee"]
dest: './public/temp'
ext: '.js'
watch:
coffee:
files: ['app/**/*.coffee']
tasks: ['livereload']
options:
nospawn: true
grunt.event.on 'watch', (action, filepath) ->
cwd = 'app/'
filepath = filepath.replace(cwd,'')
grunt.config.set('coffee',
changed:
expand: true
cwd: cwd
src: filepath
dest: './public/temp'
ext: '.js'
)
grunt.task.run('coffee:changed')
nospawn对于watch任务很重要,因此它在livereload任务之前运行新任务。我确信regarde默认情况下不会生成子进程。
我也遇到过同样的问题。我使用regarde:file
事件解决了它。
首先,我使用regarde:file
事件来侦听已更改的文件。这将为两个任务提供配置:如果源位置中的文件已删除,则为clean:coffee
;如果文件已更改/添加,则为coffee:refresh
。
然后regarde
任务将触发其任务,该任务将启动refresh:coffee
(不要与coffee:refresh
混淆(。此任务将检查是否为clean:coffee
和/或coffee:refresh
添加了配置,并在需要时运行这些任务(通过功能grunt.task.run
(。If还将重置标志,这将导致下一个接收到的regarde:file
事件再次清理配置。
深入解释:
首先,regarde
配置:
// watch for changed coffeescript files
coffee: {
files: 'path/to/coffee/**/*.coffee',
tasks: ['refresh:coffee', 'livereload']
},
然后,我监听regarde:file
事件,在该事件中,我更新配置中的clean:coffee
和coffee:refresh
文件列表。
根据regarde:file
事件提供配置:
grunt.event.on('regarde:file', function (status, target, filepath) {
if (resetFlag) {
// clean file list from previous cycle, so clean clean:coffee and coffee:refresh
// file lists
...
resetFlag = false;
}
if (status === 'deleted') {
if (filepath) {
// calculate filepath's destination and
// add it to clean:coffee filelist
}
} else {
if (!grunt.file.isDir(filepath)) {
// add filepath to coffee:refresh filelist
}
}
}
通过grunt.config()
功能可以很容易地更新配置。下面的代码片段将提供coffee:refresh
和clean:coffee
。
向coffee:refresh
添加配置:
var config = grunt.config('coffee') || {};
var value = config.refresh || {};
value.files = value.files || [];
...
var cwd = path.dirname(filepath),
src = path.basename(filepath),
dest = cwd.replace('path/to/source', 'path/to/dest');
value.files.push({
expand:true,
src:src,
dest:dest,
cwd:cwd,
ext:'.js'
});
grunt.config('coffee', config);
向clean:coffee
添加配置:
var cwd = path.dirname(filepath),
src = path.basename(filepath),
dest = cwd.replace('path/to/source', 'path/to/dest');
value.src.push(path.join(dest, src.replace('coffee', 'js')));
// clean only what has been removed
config = grunt.config('clean') || {};
config.coffee = value;
grunt.config('clean', config);
触发任务refresh:coffee
:
grunt.registerMultiTask('refresh', 'refreshing the changed file(s)', function () {
this.requires('regarde');
var tasks = [];
var clean = grunt.config('clean');
// check if there is clean:refresh config available
if (clean && clean[this.target]) {
tasks.push('clean:' + this.target);
}
var config = grunt.config(this.target);
// check if there is coffee:refresh config available
if (config && config.refresh) {
tasks.push(this.target + ':refresh');
}
// run the tasks
grunt.task.run(tasks);
// set the resetFlag back to true
resetFlag = true;
});
grunt.regarde.changed
数组是否正确?
src: ['<%= grunt.regarde.changed %>']
为src: '<%= grunt.regarde.changed %>'
我仔细查看了一下咕哝的contrib咖啡的来源,看看它是否不能正确处理你给它的任何东西。看起来你给它提供的字符串数组很可能没有被抓住和处理。
我想你不小心经过的可能是:src: [ '[path1, path2, path3, etc]' ]
如果我太离谱了,请留下评论,我会删除这个答案。