简体   繁体   English

在任务执行之间仔细执行自定义脚本

[英]Grunt execute custom script between task execution

Is it possible to do the following in a grunt task? 在艰巨的任务中可以执行以下操作吗?

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'
    ]);
  });

Basically, I require a node module with a function that load some .html files and replace some references inside them. 基本上,我需要一个具有以下功能的节点模块:加载一些.html文件并替换其中的一些引用。 The idea is to be able to do this between the two groups of tasks. 想法是能够在两组任务之间执行此操作。 I have tested it and it seems my custom function gets executed BEFORE the grunt tasks are run. 我已经测试过了,看来我的自定义功能在运行grunt任务之前就已经执行了。

This is the changeref.js module: 这是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());

};

How can I follow the order described in my example? 如何遵循示例中描述的顺序?

Your issue is that grunt.task.run does NOT run the tasks, it just adds them to the stack of tasks to be executed once the current task is finished. 您的问题是grunt.task.run不运行任务,它只是将它们添加到当前任务完成后要执行的任务堆栈中。 So your code gets executed as part of the current task, and only then do all the other tasks run. 因此,您的代码将作为当前任务的一部分执行,然后其他所有任务才能运行。

To achieve your goal, just turn your code into your own task (it's pretty painless) and just call them in sequence: 为了实现您的目标,只需将代码变成自己的任务(这很轻松),然后依次调用它们即可:

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']);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM