14

入力ファイルのセットを調べて、各ファイルで変換を実行する単調なタスクを作成しようとしています。*.in入力ファイルがによって与えられ、それぞれに対してタスクがファイルを作成すると仮定しましょう.out

私が読んだことから、設定は次のようになるはずです

grunt.initConfig({
    my_task: {
        src: 'C:/temp/*.in',
        dest: 'C:/temp/output/*.out'
    }
});

タスク登録は次のようになります。

grunt.registerTask('my_task', 'iterate files', function() {
    //iterate files.
});

grunt にファイルのリストを送信させ、それらを反復処理させる方法がわかりません。

それを行う方法はありますか?

4

1 に答える 1

19

これが私がやり終えたことであり、私の問題を解決したものです。タスク構成については、次のことを行いました。

  grunt.initConfig({
    convert_po: {
      build: {
        src: 'C:/temp/Locale/*.po',
        dest: 'C:/temp/Locale/output/'
      }
    }
  });

そして、これはタスクの実装です:

  grunt.registerMultiTask('convert_po', 'Convert PO files to JSON format', function() {
var po = require('node-po');
var path = require('path');

grunt.log.write('Loaded dependencies...').ok();

//make grunt know this task is async.
var done = this.async();

var i =0;
this.files.forEach(function(file) {
  grunt.log.writeln('Processing ' + file.src.length + ' files.');

  //file.src is the list of all matching file names.
  file.src.forEach(function(f){ 
    //this is an async function that loads a PO file
    po.load(f, function(_po){
      strings = {};
        for (var idx in _po.items){
            var item = _po.items[idx];
            strings[item.msgid] = item.msgstr.length == 1 ? item.msgstr[0] : item.msgstr;
        }
        var destFile = file.dest + path.basename(f, '.po') + '.json';
        grunt.log.writeln('Now saving file:' + destFile);
        fs.writeFileSync(destFile, JSON.stringify(strings, null, 4));

        //if we processed all files notify grunt that we are done.
        if( i >= file.src.length) done(true);
    });
  });
});
});
于 2013-09-23T09:09:59.930 に答える