coffeescript - 如何使用 grunt-regarde 和 grunt-contrib-coffee 来仅编译更改的 .coffee 文件?

标签 coffeescript gruntjs

我的项目有 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 的全部内容。任何帮助将不胜感激!

最佳答案

我有同样的问题。我使用 regarde:file 解决了它事件。

首先,我使用 regarde:file 监听更改的文件事件。这将为两个任务提供配置:clean:coffee如果源位置中的文件已被删除并且 coffee:refresh如果文件已更改/添加。

然后是regarde task 会触发它的任务,它会启动 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;
    });

关于coffeescript - 如何使用 grunt-regarde 和 grunt-contrib-coffee 来仅编译更改的 .coffee 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15076533/

相关文章:

gruntjs - 与 Prepros 相比,使用 Gulp 有什么好处?

javascript - 无法在 RedHat 中安装/识别 Javascript 运行时(适用于 Rails 3.1)

javascript - 调用类数组中的每个函数

javascript - grunt 服务 :dist, 时找不到 Angular.js 模块,但 grunt 服务工作正常

npm - SailsJS 在 View 中包含 node_module

javascript - 部署在heroku上的angularjs应用程序web.js结构

javascript - grunt 将所有 less 文件替换为 css 文件

jquery - Rails 4 Controller 不返回格式正确的 JSON

javascript - 未从文本框获取最新值

node.js - 为什么运行 Node.js 应用程序的 systemd 服务在正常停止时显示失败状态?