我有同樣的問題。我使用regarde:file
事件解決了它。
首先我使用regarde:file
事件來偵聽已更改的文件。這將爲兩個任務提供配置:clean:coffee
如果源位置中的文件已被刪除,並且coffee:refresh
如果文件已被更改/添加。
然後regarde
任務將觸發其任務,這將啓動refresh:coffee
(不要誤從coffee:refresh
)。此任務將檢查是否爲clean:coffee
和/或coffee:refresh
添加了配置,並在需要時運行這些任務(通過功能grunt.task.run
)。如果還將重置該標誌,這將導致下一個接收到的事件再次清除配置。
深入的解釋:
首先,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
。
添加config來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);
添加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;
});
'src:'<%= grunt.regarde.changed%>''爲我工作(需要用字符串包裝)。 – Adam 2013-04-29 23:38:07
謝謝,我改變了上面。 – nackjicholson 2013-04-30 06:22:57