Grunt は変更されたものの再構築のみをサポートしていないため、Makefile をラップして、「入力」ファイルのセットを計算し、最後のビルド以降に変更されていない限り、grunt をまったく呼び出さないようにしたいと思います。
grunt に、特定のタスクが何らかの方法で stdout に依存するファイルをリストするように指示できますか?
Grunt は変更されたものの再構築のみをサポートしていないため、Makefile をラップして、「入力」ファイルのセットを計算し、最後のビルド以降に変更されていない限り、grunt をまったく呼び出さないようにしたいと思います。
grunt に、特定のタスクが何らかの方法で stdout に依存するファイルをリストするように指示できますか?
カスタム タスクを使用してこれを行うこともできますが、通常の 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.
jsoverson の回答に基づいて、 Gruntfile への依存関係の追跡を延期する概念実証をまとめることができたので、GruntMakefile
ビットを呼び出してプロジェクトをビルドするルールを追加できます。このプロジェクトはコーヒースクリプトを使用しています(コーヒー以外のプロジェクトでこれを再利用したい場合は、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"]
これは機能しますが、遅いです。実行に 2.94 秒かかる裸のgrunt stylus
実行を考えると、これらの make ルールを実行して css を再生成すると、さらに 5.41 秒の純粋なオーバーヘッドがかかります。 glob ルールを追跡してすべての中間ファイルを見つけることができないため、依存関係の解決にはなりません。
したがって、これを行うことは可能ですが、「ソースファイルが変更されていない場合、grunt の実行は遅くて愚かです」という問題の解決策にはなりませんでしgrunt stylus coffee uglify
た。このプロジェクトで実行すると、既存のものを再現するのに 3.25 秒かかるためです。そして、依存関係を解決し、関連する変更がないことを見つけるだけの裸のmake
実行は、5 つを引き継ぎます。
grunt
もちろん、祖父のツールのように、いつすぐに終了できるかを知る独自の依存関係管理があれば素晴らしいことです。:-)