9

私のうなり声構成に、配列を値として持つ変数があるとします。実際の例はgrunt.regarde.changed、変更されたすべてのファイルを一覧表示するgrunt-regardeプラグインからのものです。

(この場合) 変更されたファイルをコピーできるように、テンプレートを使用してその配列を解決したいと考えています。

  copy: {
    staticWeb: {
      src: '<%= grunt.regarde.changed %>',
      dest: 'someDir'
    },

この場合に得られるのはsrc、配列ではなく、カンマで区切られた単一の文字列です。Grunt のファイル プロセッサは文字列を解析しないため、src ファイルを見つけることができません。

テンプレートを囲む一重引用符は無効な JavaScript であるため、削除できません。

grunt.regarde.changedでは、その配列をsrc変数に渡すにはどうすればよいでしょうか。

4

4 に答える 4

10

この問題は、数行のコードだけで解決方法がわかれば非常に簡単に修正できますが、何をすべきかを理解するために、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.

この例は概念を説明するためのものですが、インスタンスに合わせて簡単にカスタマイズできるはずです:)

于 2014-06-27T08:26:53.983 に答える
-2

やってみました:

copy: {
  staticWeb: {
    src: '<%= grunt.regarde.changed.split(",") %>',
    dest: 'someDir'
  }
}
于 2013-04-12T20:45:31.033 に答える