nodejs - 运行 g运行t 任务以编程方式

nodejs - run grunt task programmatically

我正在使用 g运行t 任务来 watchconcatenate 一些 js 文件。

我的第一个配置运行良好:

grunt.initConfig({
    watch: {
      js: {
        files: ['web/**/*.js'], 
        tasks: ['concat:JS'] 
      }
    },
    concat: { 
      JS: {
        files: {
          "index.js": [
            "test-1.js",
            "test-2.js",
          ],
          "about_us.js": [
            "test-3.js",
            "test-4.js",
          ],
          "store.js": [
            "test-5.js",
            "test-6.js",
          ]
        }
      }
    }
  });

我的问题是,使用此配置,每当我更改文件时,它都会连接所有内容。

我将能够仅连接特定文件(基于更改的文件)。

例如如果我更改 test-1.js 我只想连接 index.js 文件(..所以 运行 的任务应该是 'concat:JS:index.js'

所以我尝试添加一个观看事件

 grunt.event.on('watch', function(action, filepath, target) {
        var taskName = "concat:JS"; //here i calculate dinamically the specific task name to be run
        grunt.task.run(taskName);
    });

但什么也没发生..有什么想法吗?谢谢

新答案post编辑问题

使用 grunt.event.on('watch', ...) 侦听器是不适合此类需求的工具。相反,您应该为 watchconcat 任务使用多个 Targets,如下面的 Gruntfile.js 摘录所示。

Gruntfile.js

grunt.initConfig({
  watch: {
    'JS-index': {
      files: ['web/js/test-1.js', 'web/js/test-2.js'], 
      tasks: ['concat:JS-index']
    },
    'JS-about-us': {
      files: ['web/js/test-3.js', 'web/js/test-4.js'], 
      tasks: ['concat:JS-about-us']
    },
    'JS-store': {
      files: ['web/js/test-5.js', 'web/js/test-6.js'], 
      tasks: ['concat:JS-store']
    }
  },
  concat: { 
    'JS-index': {
      files: {
        'dist/js/index.js': [
          "web/js/test-1.js",
          "web/js/test-2.js",
        ]
      }
    },
    'JS-about-us': {
      files: {
        "dist/js/about_us.js": [
          "web/js/test-3.js",
          "web/js/test-4.js",
        ]
      }
    },
    'JS-store': {
      files: {
        'dist/js/store.js': [
          "web/js/test-5.js",
          "web/js/test-6.js",
        ]
      }
    }
  }
});

备注

鉴于上面显示的配置,在 运行ning grunt watch 之后将通过您的 CLI 发生以下情况:

  1. 更改 test-1.jstest-2.js 会将两个文件合并为 dist/js/index.js.

  2. 更改 test-3.jstest-4.js 会将两个文件合并为 dist/js/about_us.js.

  3. 更改 test-5.jstest-6.js 会将两个文件合并为 dist/js/store.js.

您的路径需要根据需要进行配置


编辑问题前的原始答案

how do i execute a task with grunt?

使用 grunt.task.run 是编程 运行 任务的正确方法。

但是,请参阅 grunt-contrib-watch github 存储库中的 comment。摘录如下:

"Don't use grunt.event.on('watch') to run your tasks."

和...

"The watch event is not intended for running tasks."

以下解决方案假定您的要求是连接一些 .js 个文件,其中一个文件是 changed/edited。在这种情况下,您需要利用 watch 任务的 tasks 属性 来定义要 运行 的任务(即 'concat:JS'


G运行t文件

module.exports = function(grunt) {

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-concat');

  grunt.initConfig({
    watch: {
      js: {
        files: ['path/to/js/**/*.js'], // <-- 1. Glob pattern to .js files
        tasks: ['concat:JS'] // <-- 2. Task to run when .js file changes.
      }
    },
    concat: {  // <-- 3. Configure your `concat` task as necessary.
      JS: {
        src: [
          'path/to/js/foo.js',
          'path/to/js/bar.js',
          'path/to/js/quux.js'
        ],
        dest: 'path/to/output/combined.js'
      }
    }
  });

  grunt.registerTask('default', ['watch']);

  grunt.event.on('watch', function(action, filepath, target) {
    console.log("yep, this code is being executed");
    // 4. <-- Do not run task from 'on' listener event.
  });
}

备注

  1. 在您的 watch 任务中定义源 .js 文件的 glob 模式以观察变化。
  2. 指定 .js 文件更改时 运行 的任务; IE。 'concat:JS'
  3. 根据需要配置您的 concat 任务。
  4. grunt.event.on('watch', ...) 侦听器中删除 grunt.task.run('concat:JS');
  5. 使用上面的要点和 运行ning grunt 当对存储在 path/to/js/目录。 (您需要根据您的要求配置路径)
  6. 虽然 grunt.event.on('watch', ...) 侦听器不应该用于 运行 任务,但它可以用于配置其他任务。