10

我想只在我保存的单个文件上运行咖啡棉绒和咖啡编译。我的项目中有数百个 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 任务仅在更改的文件上成功运行。

咖啡编译不会产生任何 JS 文件,即使 grunt 说它运行。

这是保存单个咖啡文件后的输出:

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

然后稍微改变你的咖啡脚本任务。如果您转到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

然后在您的监视任务中使用 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

这里有两个问题。

第一的:

Grunt 将更改的文件路径生成为src/coffeescript/some_file.coffee,但在您的coffee任务中定义cwdsrc/coffeescript.

所以咖啡任务实际上只是期待,some_file.coffee但它正在获取src/coffeescript/some_file.coffee,然后将其扩展到src/coffeescript/src/coffeescript/some_file.coffeeO_o

您的coffeelint任务没有任何cwd内容,因此它使用完整的文件路径成功运行。

相应地调整文件路径,或cwd从咖啡配置中删除。

grunt.config(['coffee', 'all'], filepath.replace("src/coffeescript", ""))

第二:

这是次要的,可能不需要,但也要注意这一点。

grunt.event.on 'watch', (action, filepath) ->
  grunt.config(['coffeelint', 'all'], filepath)
  grunt.config(['coffee', 'all'], filepath)
  ^^^^^^^ You might have to change above line to:
  grunt.config(['coffee', 'all', 'src'], filepath)

在您的 coffeelint 任务中,源直接设置在all. 但是在您的coffee任务中,源设置在all -> src. 反映同样的情况也可能有用。

编辑:小附录

于 2014-02-05T14:45:12.813 回答
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 没有提供目标文件路径作为过滤器函数的第二个参数,但这太糟糕了。这将允许一个简单的检查来查看生成的文件是否存在并且比源文件更旧...... Make开箱即用......</p>

于 2014-04-25T00:02:12.557 回答