11

私のプロジェクトには 300 以上の CoffeeScript ファイルがあるため、すべてを再コンパイルするには数秒かかります。変更された CoffeeScript ファイルのみを再コンパイルしたいと思います。

これは私がこれまでに行った中で最も近いものですが、「frontend-sr​​c/coffeescript」フォルダー構造が src ディレクトリから dest ディレクトリにコピーされています。

coffee: {
  changed: {
    expand: true,
    cwd: './',
    src: ['<%= grunt.regarde.changed %>'],
    dest: 'public/js/',
    ext: '.js'
  }
},
regarde: {
  coffee: {
    files: 'frontend-src/coffeescript/**/*.coffee',
    tasks: ['coffee:changed', 'livereload']
  }
}

これは Grunt 0.4.0 ですべてです。どんな助けでも大歓迎です!

4

3 に答える 3

3

私は自分でこの問題を抱えていましたが、この問題に関するコメントに触発された解決策を思いつくことができました: https://github.com/gruntjs/grunt-contrib-watch/issues/14

実際には grunt-contrib-watch プラグイン用ですが、同様のイベントがあるため、grunt-regarde でも機能するはずです。

アイデアは、コールバックをイベントにバインドすることです。このwatchイベントでは、変更されたファイルのパスを使用して新しいタスクを grunt 構成に追加し、それを実行します。

私からGruntfile.coffee

coffee:
    app:
        expand: true
        cwd: 'app/'
        src: ['*.coffee',"**/*.coffee"]
        dest: './public/temp'
        ext: '.js'
watch: 
    coffee:
        files: ['app/**/*.coffee']
        tasks: ['livereload']
        options:
            nospawn: true

grunt.event.on 'watch', (action, filepath) ->       
    cwd = 'app/'
    filepath = filepath.replace(cwd,'')
    grunt.config.set('coffee',
        changed:
            expand: true
            cwd: cwd
            src: filepath
            dest: './public/temp'
            ext: '.js'
    )
    grunt.task.run('coffee:changed')

nospawn は watch タスクにとって重要であるため、 livereload タスクの前に新しいタスクを実行します。私は、デフォルトでは子プロセスを生成しないと確信しています。

于 2013-03-15T14:07:03.330 に答える
2

私は同じ問題を抱えていました。イベントを使用して解決しましたregarde:file

最初に、regarde:fileイベントを使用して変更されたファイルをリッスンします。clean:coffeeこれにより、ソースの場所のファイルが削除されたcoffee:refresh場合と、ファイルが変更/追加された場合の 2 つのタスクの構成がフィードされます。

次に、regardeタスクがそのタスクをトリガーし、起動refresh:coffeeします (と間違えないようにcoffee:refresh)。clean:coffeeこのタスクは、および/または のために追加された構成があるかどうかを確認しcoffee:refresh、必要に応じてこれらのタスクを実行します ( function を介して grunt.task.run)。フラグもリセットすると、次に受信したregarde:fileイベントで構成が再度クリーンアップされます。

詳細な説明:

まず、regarde設定:

 // watch for changed coffeescript files
 coffee: {
    files: 'path/to/coffee/**/*.coffee',
    tasks: ['refresh:coffee', 'livereload']
 },

次に、イベントをリッスンし、構成内のファイル リストとファイル リストregarde:fileを更新します。clean:coffeecoffee:refresh

regarde:fileイベントに基づいて構成をフィードします。

grunt.event.on('regarde:file', function (status, target, filepath) {
   if (resetFlag) {
      // clean file list from previous cycle, so clean clean:coffee and coffee:refresh
      // file lists
      ...

      resetFlag = false;
   } 
   if (status === 'deleted') {
        if (filepath) {
            // calculate filepath's destination and  
            // add it to clean:coffee filelist
        }
    } else {
        if (!grunt.file.isDir(filepath)) {
            // add filepath to coffee:refresh filelist
        }
    }
}

関数を介して構成を簡単に更新できgrunt.config()ます。フィードするコード スニペットの下coffee:refreshclean:coffee.

に構成を追加coffee:refresh:

var config = grunt.config('coffee') || {};
var value = config.refresh || {};
value.files = value.files || [];
...
var cwd = path.dirname(filepath),
    src = path.basename(filepath),
    dest = cwd.replace('path/to/source', 'path/to/dest');
    value.files.push({
       expand:true,
       src:src,
       dest:dest,
       cwd:cwd,
       ext:'.js'
    });
grunt.config('coffee', config);

に構成を追加clean:coffee:

    var cwd = path.dirname(filepath),
        src = path.basename(filepath),
        dest = cwd.replace('path/to/source', 'path/to/dest');
        value.src.push(path.join(dest, src.replace('coffee', 'js')));
    // clean only what has been removed
        config = grunt.config('clean') || {};

    config.coffee = value;

    grunt.config('clean', config);

タスクrefresh:coffeeがトリガーされます:

    grunt.registerMultiTask('refresh', 'refreshing the changed file(s)', function () {
        this.requires('regarde');

        var tasks = [];
        var clean = grunt.config('clean');

        // check if there is clean:refresh config available
        if (clean && clean[this.target]) {
            tasks.push('clean:' + this.target);
        }
        var config = grunt.config(this.target);

        // check if there is coffee:refresh config available
        if (config && config.refresh) {
            tasks.push(this.target + ':refresh');
        }
        // run the tasks
        grunt.task.run(tasks);

        // set the resetFlag back to true
        resetFlag = true;
    });
于 2013-03-19T10:06:56.507 に答える
0

grunt.regarde.changed配列は正しいですか?

したほうがいいsrc: ['<%= grunt.regarde.changed %>']

なれsrc: '<%= grunt.regarde.changed %>'

grunt-contrib-coffee のソースを少し調べて、与えられたものを正しく処理していないかどうかを確認しました。あなたが与えている文字列化された配列が捕らえられず、処理されない可能性が高いように見えました。

あなたが偶然通り過ぎているのは次のようなものかもしれません:src: [ '[path1, path2, path3, etc]' ]

私がベースから外れている場合は、コメントを残してください。この回答を削除します。

于 2013-03-10T11:30:56.557 に答える