この問題は、数行のコードだけで解決方法がわかれば非常に簡単に修正できますが、何をすべきかを理解するために、Grunt ソース コードからすべての関連情報を掘り下げるのにかなりの時間がかかりました。背景を説明しながら...
構成オブジェクトのプロパティを取得する一般的な方法は簡単です。
<%= some.property %> // fetches grunt.config.get('some.property')
これは、オブジェクトに設定されたすべてのプロパティで機能しgrunt.config
ます。これには、(もちろん) に渡される構成が含まれgrunt.initConfig()
ます。<%= concat.typescriptfiles.dest %>
これが、構成オブジェクトのすべてのプロパティがテンプレート自体のスコープ内にあるため、 などで他のタスク変数を直接参照できる理由です。
技術的には、この展開は、(LoDash) テンプレートがoptions
オブジェクト (定義されている場合) またはgrunt.config
オブジェクトと共にテンプレート プロセッサ (LoDashtemplate
関数) に渡されるときに発生します。
したがって、これは構成自体で設定された値に対して、または を介して動的に割り当てられた値を使用することによって機能しますgrunt.config.set()
。詳細については、API ドキュメントを参照してください。
同じように機能しないのは、構成オブジェクトで使用できない値にアクセスすることです。よくわからない何らかの理由で、他のすべての値は常に文字列になるようです。これは、それらに直接アクセスするか、メソッド呼び出しを介してアクセスするかに関係なく発生します。たとえば、構成上の配列にアクセスしようとするとgrunt.config.get()
、文字列が取得されます。
ファイルの順序が保持される問題の回避策
受け入れられた答えはある意味で機能しますが、グロビング構文のため、ファイルの順序を保持しないglob()
モジュールによって解析されます。これは私のビルドにとってはノーノーでした。
使用する配列が構成オブジェクトで使用できない場合の回避策は、中間タスクを介して構成に追加することです。次のようなものが機能するはずです。
// This variable will be used twice to demonstrate the difference
// between directly setting an attribute on the grunt object
// and using the setter method on the grunt.config object
var myFiles = ['c/file1.txt', 'a/file2.txt', 'b/file3.txt']
module.exports = function(grunt){
grunt.initConfig({
debug : {
using_attribute: {
src : '<%= grunt.value_as_attribute %>' // will be a string
},
using_task: {
src : '<%= value_by_setter %>' // will be an array
},
no_task_direct_setter: {
src : '<%= value_by_setter_early %>' // will be an array
}
}
});
grunt.registerTask('myValSetter', function() {
grunt.config.set('value_by_setter', myFiles );
});
// a task that will report information on our set values
grunt.registerMultiTask('debug', function(){
grunt.log.writeln('data.src: ', this.data.src);
grunt.log.writeln('type: ', Array.isArray(this.data.src)? "Array" : typeof this.data.src);
});
grunt.value_as_attribute = myFiles;
grunt.config.set('value_by_setter_early', myFiles );
grunt.registerTask('default',['myValSetter', 'debug']);
}
これは出力されます
$ grunt
Running "myValSetter" task
Running "debug:using_attribute" (debug) task
data.src: c/file1.txt,a/file2.txt,b/file3.txt
type: string
Running "debug:using_task" (debug) task
data.src: [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type: Array
Running "debug:no_task_direct_setter" (debug) task
data.src: [ 'c/file1.txt', 'a/file2.txt', 'b/file3.txt' ]
type: Array
Done, without errors.
この例は概念を説明するためのものですが、インスタンスに合わせて簡単にカスタマイズできるはずです:)