将Grunt更新用于自定义任务

时间:2015-09-17 11:25:02

标签: javascript gruntjs grunt-contrib-watch

我尝试使用grunt-newer来查看文件夹中的文件,如果有任何更改,则触发自定义任务。

我的Gruntfile.js中有这样的东西:

grunt.initConfig({
   watch: {
      widgets: {
         files: "/somepath/*.js",
         tasks: ['newer:mycustomtask']
      }
   }
});

grunt.registerTask("mycustomtask", ["description of my task"], function() {
  console.log("me has been triggered");
});

每当我跑" grunt watch"时,我都有这个输出:

Running "watch" task
Waiting...
File "/somepath/WidgetA.js" changed.
Running "newer:mycustomtask" (newer) task
Fatal error: The "newer" prefix is not supported for aliases
我用谷歌搜索但没有发现任何相关信息。任何人都知道我怎么能实现这个?我现在需要在我的" customtask"哪些文件已被更改

3 个答案:

答案 0 :(得分:1)

如果您引用了未安装未配置的任务(内部监控或并发),则会收到此错误输出。

当您从其他项目复制粘贴监视配置时,通常会发生这种情况。

答案 1 :(得分:0)

我遇到了类似的要求,我最终得到的解决方案大致如下。我们假设项目结构是:

Gruntfile.js
package.json
src/
    config.js
    data.js
tasks/
    customtask.js

此处,src目录包含将由watch监控的数据,而自定义任务的定义存储在tasks/customtask.js中。出于此示例的目的,此任务仅打印已更改文件的文件名:

var fs = require('fs');
var path = require('path');

module.exports = function(grunt) {
    grunt.registerMultiTask('customtask', function() {
        var done = this.async();

        if(!this.files){ done(); return; }

        this.files[0].src.forEach(file_name => {
            console.log(file_name);
        });

        done();
    });
};

现在,Gruntfile.js看起来像是:

module.exports = function(grunt) {

    const files = ['src/config.js', 'src/data.js'];

    grunt.initConfig({

        pkg: grunt.file.readJSON('package.json'),

        customtask: {
            release: {
                src: files
            }
        },

        watch: {
            data: {
                files: files,
                tasks: ['customtask:release']
            },
            options: {
                spawn: false
            }
        }

    });

    grunt.loadTasks('tasks');
    grunt.loadNpmTasks('grunt-contrib-watch');

    var changedFiles = Object.create(null);
    var onChange = grunt.util._.debounce(function() {
        grunt.config('customtask.release.src', Object.keys(changedFiles));
        changedFiles = Object.create(null);
    }, 200);
    grunt.event.on('watch', function(action, filepath) {
        changedFiles[filepath] = action;
        onChange();
    });

    grunt.registerTask('build', ['watch:data']);
};

这里,它指定:

  1. 感兴趣的文件是['src/config.js', 'src/data.js']
  2. 我们的customtask原则上对这些文件进行操作(如果它将被直接调用)
  3. watch应该观察这些文件并在发生变化时启动customtask:release
  4. grunt.loadTasks('tasks')从目录tasks加载所有“任务定义”,即此处仅加载customtask
  5. grunt.registerTask('build', ['watch:data'])定义了watch:data
  6. 的“快捷方式”

    最后,为了仅针对已更改的文件调用customtask,此示例使用“根据需要编译文件”一节中documentation中使用的策略。在松散的术语中,它组装对象中所有已更改的文件,然后使用其中的键来动态修改src的{​​{1}}属性。

    运行customtask然后启动“监视”。如果在另一个终端窗口中运行,例如grunt build,则输出为:

    touch src/*.js

    最后两行来自Running "watch:data" (watch) task Waiting... >> File "src/config.js" changed. >> File "src/data.js" changed. Running "customtask:release" (customtask) task src/config.js src/data.js ...

答案 2 :(得分:-1)

您只需要为您的任务配置一个配置条目(即使是空条目):

grunt.initConfig({

  mycustomtask: {
  },

  watch: {
    widgets: {
      files: "/somepath/*.js",
      tasks: ['newer:mycustomtask']
    }
  }
});