Javascript Grunt在任务执行之间执行自定义脚本

Javascript Grunt在任务执行之间执行自定义脚本,javascript,node.js,gruntjs,Javascript,Node.js,Gruntjs,在grunt任务中是否可以执行以下操作 grunt.registerTask('build', 'Building app', function () { grunt.task.run([ 'clean:dist', 'wiredep', 'useminPrepare', 'ngtemplates', 'concat:generated', 'ngAnnotate', 'copy:dist',

在grunt任务中是否可以执行以下操作

grunt.registerTask('build', 'Building app', function () {
    grunt.task.run([
      'clean:dist',
      'wiredep',
      'useminPrepare',
      'ngtemplates',
      'concat:generated', 
      'ngAnnotate',
      'copy:dist',
      'cdnify',
      'cssmin'
    ]);

    // Replace "vendor-*.js" references to "vendor.js"
    require('./custom_modules/changeref/changeref')(grunt, this.async, {
      filePath: './dist/*.html',
      find: /(vendor-).*\.js/ig, 
      replaceBy: 'vendor.js'
    });

    grunt.task.run([
      'uglify',
      'filerev',
      'usemin',
      'htmlmin'
    ]);
  });
基本上,我需要一个带有函数的节点模块,该函数加载一些
.html
文件并替换其中的一些引用。我们的想法是能够在两组任务之间做到这一点。我已经对它进行了测试,似乎我的自定义函数在grunt任务运行之前就被执行了

这是
changeref.js
模块:

'use strict';

var path = require('path');

module.exports = function(grunt, async, options) {

    var files;

    grunt.verbose.writeln('Checking options...');

    options = options || {
        filePath:  options.filePath || './*.html',
        find:      options.find,
        replaceBy: options.replaceBy || ''
    };

    if ( !options ) { throw new Error('options is undefined'); }
    if ( !options.find ) { throw new Error('options.find is undefined'); }

    grunt.verbose.writeflags(options, 'Running changeref with options: ');  

    files = grunt.file.expand({ filter: 'isFile' }, options.filePath); 
    files = files.map(function (fp) {
        return { path: fp, body: grunt.file.read(fp) };
    }); 

    if ( files.length ) {
        grunt.verbose.writeln('Your "filePath" pattern has found ' + files.length + ' file(s).');    
    } else {
        grunt.verbose.warn('Not a single file was found.');
    }

    // File iteration
    // files.forEach(function (file, index) {
    grunt.util.async.forEach(files, function (file, cbInner) {
        grunt.verbose.writeln('Processing ' + file.path + '...');
        var fileContent, 
            strFound = function () {
                var match;

                // The find patter is a REGEXP
                if ( typeof options.find === "object" ) { match = file.body.match(options.find); } 

                // The find pattern is a string
                else { match = file.body.indexOf(options.find); }

                if ( match && match.length ) {
                    return ((match.length !== 0) || (match !== -1));
                }

                return false;
            };

        if ( !strFound() ) {
            grunt.verbose.warn("Your pattern hasn't match anything and the current file will remain untouched.");

            return;
        }

        fileContent = file.body.replace(options.find, options.replaceBy);

        grunt.verbose.writeln('Preparing to write file ' + file.path);

        // Write the destination file. 
        grunt.file.write(file.path, fileContent);

        cbInner();
    }, async());

};

如何遵循示例中描述的顺序?

您的问题是grunt.task.run不运行任务,它只是将它们添加到当前任务完成后要执行的任务堆栈中。因此,您的代码将作为当前任务的一部分执行,然后所有其他任务才会运行

为了实现您的目标,只需将您的代码转换为您自己的任务(这非常轻松),然后按顺序调用它们:

grunt.registerTask("yourReplace", function() {
  // Replace "vendor-*.js" references to "vendor.js"
  require('./custom_modules/changeref/changeref')(grunt, this.async, {
    filePath: './dist/*.html',
    find: /(vendor-).*\.js/ig, 
    replaceBy: 'vendor.js'
  });
});

grunt.registerTask("build", ['clean:dist', 'cssmin', 'yourReplace', 'uglify']);

您的问题是grunt.task.run不运行任务,它只是将它们添加到当前任务完成后要执行的任务堆栈中。因此,您的代码将作为当前任务的一部分执行,然后所有其他任务才会运行

为了实现您的目标,只需将您的代码转换为您自己的任务(这非常轻松),然后按顺序调用它们:

grunt.registerTask("yourReplace", function() {
  // Replace "vendor-*.js" references to "vendor.js"
  require('./custom_modules/changeref/changeref')(grunt, this.async, {
    filePath: './dist/*.html',
    find: /(vendor-).*\.js/ig, 
    replaceBy: 'vendor.js'
  });
});

grunt.registerTask("build", ['clean:dist', 'cssmin', 'yourReplace', 'uglify']);