10

保存している単一のファイルに対してのみ、coffee lint と coffee compile を実行したいと思います。私のプロジェクトには何百もの CoffeeScript ファイルがあり、それらすべてをコンパイルするには時間がかかりすぎます。

これが私のGruntfileです:

module.exports = (grunt) ->

  grunt.initConfig

    pkg: grunt.file.readJSON 'package.json'

    coffee:
      all:
        expand: true
        bare: true
        cwd: 'src/coffeescript/'
        src: '**/*.coffee'
        dest: 'public/js/compiled'
        ext: '.js'

    coffeelint:
      all: ['src/coffeescript/**/*.coffee']

    watch:
      coffeescript:
        files: ['src/**/*.coffee']
        tasks: ['coffeelint', 'coffee']
        options:
          spawn: false

  grunt.event.on 'watch', (action, filepath) ->
    grunt.config(['coffeelint', 'all'], filepath)
    grunt.config(['coffee', 'all'], filepath)

  grunt.loadNpmTasks 'grunt-coffeelint'
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-contrib-watch'

  grunt.registerTask 'default', ['coffeelint', 'coffee', 'watch']

coffeelint タスクは、変更されたファイルに対してのみ正常に実行されます。

コーヒーのコンパイルは、grunt が実行すると言いますが、JS ファイルを生成しません。

単一のコーヒー ファイルを保存した後の出力は次のとおりです。

OK
>> File "src/coffeescript/app.coffee" changed.


Running "coffeelint:all" (coffeelint) task
>> 1 file lint free.

Running "coffee:all" (coffee) task

Running "watch" task
Completed in 0.009s at Sat Feb 01 2014 13:10:07 GMT-0600 (CST) - Waiting...

ここで何が問題なのですか?どんな助けでも大歓迎です!

アップデート:

これが実際の例です:

module.exports = (grunt) ->

  fs = require 'fs'
  isModified = (filepath) ->
    now = new Date()
    modified =  fs.statSync(filepath).mtime
    return (now - modified) < 10000

  grunt.initConfig

    coffee:
      options:
        sourceMap: true
        bare: true
        force: true # needs to be added to the plugin
      all:
        expand: true
        cwd: 'src/coffeescript/'
        src: '**/*.coffee'
        dest: 'public/js/compiled'
        ext: '.js'
      modified:
        expand: true
        cwd: 'src/coffeescript/'
        src: '**/*.coffee'
        dest: 'public/js/compiled'
        ext: '.js'
        filter: isModified

    coffeelint:
      options:
        force: true
      all:
        expand: true
        cwd: 'src/coffeescript/'
        src: '**/*.coffee'
      modified:
        expand: true
        cwd: 'src/coffeescript/'
        src: '**/*.coffee'
        filter: isModified

    watch:
      coffeescript:
        files: ['src/**/*.coffee']
        tasks: ['coffeelint:modified', 'coffee:modified']

  grunt.loadNpmTasks 'grunt-coffeelint'
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-contrib-watch'

  grunt.registerTask 'default', ['coffeelint:all', 'coffee:all', 'watch']
4

4 に答える 4

10

grunt-newerを使用して、ソースがコンパイルされた出力よりも新しい場合にのみファイルをコンパイルできます。

次を使用してインストールします。

npm install grunt-newer --save-dev

次に、coffeescript タスクを少し変更します。Grunt.js ドキュメントの「ファイル オブジェクトを動的に構築する」セクションに移動するfilesと、タスクを正しく実行するために、 ファイルの場所とコンパイルされた出力の場所に関連する情報を配列に保持する必要があることがわかります。

などの追加オプションはbare: true、オプション オブジェクトで指定できます。

したがって、coffeeタスクでは、代わりに次のようにします。

   coffee:
      all:
        files: [{
          expand: true
          cwd: 'src/coffeescript/'
          src: '**/*.coffee'
          dest: 'public/js/compiled'
          ext: '.js'
        }]
        options:
          bare: true
          spawn: false

次に、watch タスクで newer を次のように使用します。

    watch:
      coffeescript:
        files: ['src/**/*.coffee']
        tasks: ['newer:coffeelint:all', 'newer:coffee:all']
        options:
          spawn: false

Newer は、コンパイルされたバージョンより新しいファイルのみをコンパイルします。

于 2014-02-04T22:06:41.390 に答える
4

このようなものをcタスクに追加してみてください

 coffee:
  all:
    filter: (filepath) ->
        fs = require('fs')
        now = new Date()
        modified =  fs.statSync(filepath).mtime
        return (now - modified) < 10000 # or another difference in millyseconds

ドキュメントで詳細を読む

于 2014-02-04T22:19:42.843 に答える
0

任意の継続時間のしきい値を使用する代わりに、各変更時間をマップに保存できます。

fs = require 'fs'
mtimes = {}
isModified = (filepath) ->
    mtime = fs.statSync(filepath).mtime
    if mtimes[filepath]?
        return mtimes[filepath] < mtime
    else
        mtimes[filepath] = mtime
        return yes

grunt がフィルター関数の 2 番目の引数として宛先ファイル パスを提供しないのは残念ですが。これにより、生成されたファイルが存在し、ソースよりも古いかどうかを確認する簡単なチェックが可能になります... Makeはすぐにそれを行います...</p>

于 2014-04-25T00:02:12.557 に答える