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文件是否已更改/添加。

然后该regarde任务将触发其任务,该任务将启动refresh:coffee(不要误会coffee: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']
 },

然后我监听该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 回答