作为Grunt doesn't support only rebuilding what has changed,我想在它周围包装一个Makefile,只是计算一组“输入”文件,而不是根本不调用grunt,除非它们自上次构建以来有任何变化。
你能告诉grunt只是列出某个特定任务在stdout上依赖的文件吗?
答案 0 :(得分:5)
你可以使用自定义任务执行此操作,但它仍然会被正常的grunt输出包裹。
grunt.registerTask('src', function(){
var taskConfig = grunt.config(this.args.join('.'));
var expanded = grunt.task.normalizeMultiTaskFiles(taskConfig);
expanded.forEach(function(files){
files.src.forEach(function(file) {
console.log(file);
});
});
});
列出所有文件的命令行语法,例如,名为“myFiles”的jshint的子任务将是grunt src:jshint:myFiles
$ grunt src:jshint:myFiles
Running "src:jshint:myFiles" (src) task
file1.js
file2.js
dir/file3.js
Done, without errors.
答案 1 :(得分:0)
基于jsoverson's answer,我设法拼凑了一个将依赖关系跟踪推迟到Gruntfile的概念验证,因此我可以添加Makefile
规则来调用grunt位来构建项目。这个项目使用咖啡脚本(如果你想为一些非咖啡项目重复使用,请使用http://js2coffee.org/转换为js),所以在Gruntfile.coffee
我添加了
gruntGetPaths = (fn) -> ->
taskConfig = grunt.config @args.join '.'
grunt.task.normalizeMultiTaskFiles(taskConfig)
.forEach fn ? (files) ->
files.src.forEach (path) ->
console.log path
grunt.registerTask 'src', gruntGetPaths
grunt.registerTask 'dst', gruntGetPaths (files) -> console.log files.dest
向我提供生成grunt-junk-wrapped文件列表的grunt src:...
和grunt dst:...
规则。
似乎垃圾被保证着色/添加一个尾随的空行(至少使用grunt v0.4.1
/ grunt-cli v0.1.9
),因此通过将其输出管道输出到egrep -v '\e|^$'
来切断它
在Makefile
的顶部附近,我添加了一些宏:
define GRUNT
$(shell grunt --no-write $1 | egrep -v '\e|^$$')
endef
define SRC
$(call GRUNT,src:$1)
endef
define DST
$(call GRUNT,dst:$1)
endef
...然后从Gruntfile
借用知识的规则:
$(call DST,stylus:compile): coffee $(call SRC,stylus:compile)
grunt stylus
$(call DST,coffee:glob_to_multiple): coffee $(call SRC,coffee:glob_to_multiple)
grunt coffee
$(call DST,uglify:my_target): coffee $(call SRC,uglify:my_target)
grunt uglify
coffee:
npm install 2>&1 | tee $@
...具有相应的设置,如下所示:
@initConfig
pkg: grunt.file.readJSON "package.json"
stylus:
compile:
options:
paths: ["src/stylus/"]
import: ["nib"]
files:
"stylesheets/foo.css": "src/stylus/foo.styl"
"stylesheets/foo-dev.css": ["src/stylus/foo.styl", "src/stylus/foo-dev.styl"]
coffee:
glob_to_multiple:
expand: true
cwd: 'src/coffee/'
src: ['*.coffee']
dest: 'javascripts/'
ext: '.js'
uglify:
my_target:
files:
"javascripts/foo.min.js": ["javascripts/foo.js"]
这有效,但速度很慢。给定grunt stylus
运行需要2.94s运行,运行这些规则来重新生成css需要另外5.41s的纯开销,这有点可怕 - 如果我核对所有生成的文件并尝试重新生成min.js,没有依赖解析,因为无法追溯到glob规则以查找所有中间文件。
因此虽然可以做到这一点,但它并没有最终解决问题“当没有源文件发生变化时,运行grunt很慢而且很愚蠢”,因为在这个项目中运行grunt stylus coffee uglify
需要3.25再现已经存在的内容的秒数,以及仅解析依赖关系并发现没有任何相关更改的裸make
运行需要超过五个。
如果grunt
有自己的依赖关系管理来知道什么时候可以立即退出,就像我们祖父的工具那样,那当然会很棒。 : - )