2013-02-25 2 views
11

私のプロジェクトには300以上のCoffeeScriptファイルがあるので、すべてを再コンパイルするのに数秒かかります。変更されたCoffeeScriptファイルのみを再コンパイルしたいのですが。変更された.coffeeファイルのみをコンパイルするために、grunt-contrib-coffeeでgrunt-regardeを使用するにはどうすればよいですか?

ここまでは私が今までに一番近かったが、 "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です。どんな助けでも大歓迎です!

答えて

2

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

最初に、regarde:fileイベントを使用して変更されたファイルをリッスンします。これにより、ソースロケーション内のファイルが削除されている場合はclean:coffee、ファイルが変更/追加された場合はcoffee:refreshの2つのタスクの設定が入力されます。

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

:すべての

まず、regarde設定:

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

その後、私は、私は彼らの設定にclean:coffeecoffee:refreshファイルリストを更新regarde:fileイベントのために聞きます。

フィード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; 
    }); 
0

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

src: ['<%= grunt.regarde.changed %>']

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

であるべき私は正しく、あなたがそれを与えているものは何でも処理していない可能かどうかを確認するために第二のために作男-のcontrib-コーヒーのソースを通じて見えました。あなたがそれを与えているストリング配列が、捕まえられておらず、扱われていないように見えます。

私はあなたが誤って渡しているものかもしれないと思う:src: [ '[path1, path2, path3, etc]' ]

私は道オフベースだし、コメントを残して、私はこの回答を削除します場合。

+1

'src: '<%= grunt.regarde.changed%>''私のために働いた(文字列でラップする必要がある)。 – Adam

+0

ありがとう、私はそれを上に変更しました。 – nackjicholson

3

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

それは作男-contribのウォッチプラグインのために実際にですが、それが必要同じような出来事を持っているので、嫌な思いをする人のためにも働きます。

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は、時計のタスクのために重要であるので、livereloadタスクの前に新しいタスクを実行します。私は、デフォルトでは、子プロセスが生成されないことを確信しています。

関連する問題