为不可多任务的grunt插件创建两个配置

Create two configurations for a grunt plug-in that is not multi-taskable

我用的是grunt包grunt-preprocess,显然不支持多任务

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  preprocess: {
    options: {
      context: {
        ENV: grunt.option('env') || 'prod'
      },
    },
    all_from_dir: {
      src: '*.*',
      cwd: 'src/',
      dest: 'src',
      expand: true
    }
  },
})

现在我想执行preprocess两次,一次从src目录,一次从dist目录。我应该如何配置这个包来实现它?

我试过这个配置;

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  preprocess: {
    first: {
      options: {
        context: {
          ENV: grunt.option('env') || 'prod'
        },
      },
      all_from_dir: {
        src: '*.*',
        cwd: 'src/',
        dest: 'src',
        expand: true
      }
    },
    second: {
      options: {
        context: {
          ENV: grunt.option('env') || 'prod'
        },
      },
      all_from_dir: {
        src: '*.*',
        cwd: 'dist/',
        dest: 'dist',
        expand: true
      }
    }
  }
})

然后执行grunt preprocess:first。但是它不起作用:

PS D:\workspace\environment-compile> grunt preprocess:first
Running "preprocess:first" (preprocess) task
Done.

是的,你是对的 preprocess 只是单个任务,因此不允许定义多个 targets

您需要创建另一个动态配置 preprocess 任务的自定义任务,然后 运行 执行它。

例如:

Gruntfile.js

module.exports = function (grunt) {

  grunt.loadNpmTasks('grunt-preprocess');

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

    preprocess: {
      options: {
        context: {
          ENV: grunt.option('env') || 'prod'
        },
      },
      all_from_dir: {
        src: '*.*',
        cwd: 'src/',
        dest: 'src',
        expand: true
      }
    },
    // ...
  });

  // Custom task dynamically configures the `preprocess` Task and runs it.
  grunt.registerTask('preprocess_dist', function() {
    grunt.config.set('preprocess.all_from_dir.cwd', 'dist/');
    grunt.config.set('preprocess.all_from_dir.dest', 'dist');
    grunt.task.run(['preprocess']);
  });

  grunt.registerTask('preprocessBoth', [ 'preprocess', 'preprocess_dist' ]);

};

运行:

通过您的 CLI 运行 以下单个命令执行 preprocess 任务两次,一次来自 src 目录,一次来自 dist 目录:

grunt preprocessBoth

解释:

  1. 名为 preprocess_dist 的自定义任务动态配置 cwddest 属性的值,分别将它们设置为 'dist/''dist'。这是通过 grunt.config.set 方法
  2. 完成的
  3. 然后任务是运行通过grunt.task.run方法。
  4. 最后一行代码写着:

    grunt.registerTask('preprocessBoth', [ 'preprocess', 'preprocess_dist' ]);
    

    创建一个名为 preprocessBoth 的任务并将以下两个任务添加到 taskList:

    • preprocess
    • preprocess_dist
  5. 基本上当你 运行 grunt preprocessBoth 时会发生什么:

    • preprocess 任务 运行 使用 src 目录中的文件。
    • 然后自定义 preprocess_dist 任务 运行s 使用 dist 目录中的文件。
  6. 如果您愿意,您还可以通过 CLI 独立地 运行 每个任务,即:

    grunt preprocess

    grunt preprocess_dist