8

我有一个用于构建 Web 应用程序 的grunt文件。

这个grunt文件使用了几个grunt contrib 插件,如cleancopycompasscssmin等来正确构建 Web 应用程序。

这个grunt文件还应该处理生成 CSS 和复制文件以创建主题 CSS 文件。目前,我正在为每个主题添加目标到我的clean,copy和(etc.) 任务中。compass

这在 grunt 文件中变得笨拙,并且在添加新主题时会变得困难且容易出错。

为了使事情更容易,我真的很想创建自己的自定义“主题” grunt任务,该任务将在内部使用其他grunt contrib 任务(cleancopycompass等)来执行指定主题的所有必要任务。

只需少量的主题配置数据(主要是其源文件夹),我就有足够的信息来调用其他任务(因为主题源文件和目标文件是非常约定俗成的)。

我似乎找不到从我的自定义任务中调用任务的方法,我可以在其中以编程方式指定所有配置选项、文件等。

有谁知道我该怎么做?

谢谢,埃德

4

4 回答 4

8

我似乎找不到从我的自定义任务中调用任务的方法,我可以在其中以编程方式指定所有配置选项、文件等。

我认为您不能使用特定配置运行 grunt 多任务,因为多任务配置是从任务配置中指定的目标中读取的。

因此,一种方法是在运行之前修改任务配置。

这是一个非常基本的示例:

grunt.registerMultiTask('theme', function() {
    var themeName = this.options().name;
    grunt.config.set('yourOtherTask.dist.options.name', themeName);
    grunt.task.run('yourOtherTask');
});
于 2013-08-27T09:45:55.680 回答
5

就这么简单:

concat: {
  web: {
    src: ['web/**/*.js'],
    dest: 'dist/main.js'
  }
},

uglify: {
  server: {
    src: '<%= concat.web.dest %>',
    dest: '<%= concat.web.dest %>.min.js'
  }
},
于 2014-04-01T18:30:59.717 回答
1

我有同样的问题并解决了它。

请记住:grunt 是在 node 中运行的所有 JavaScript,所以你可以做任何 JavaScript 和 node 支持的事情。

我的解决方案是这样工作的:

首先,将核心应用程序的 grunt 的所有内容放在一个单独的 JavaScript 文件中,例如“grunt-my-app-core.js”。在那个导出两个函数中,init(grunt)getConfig(grunt, options)

(function() {
    "use strict"; //enable ECMAScript 5 Strict Mode

    function init(grunt) {
    }

    function getConfig(grunt, options) {
        return {};
    }


    ///////////////////////////
    //   Exports
    exports = module.exports = {
        init: init,
        getConfig: getConfig
    };
})();

init(grunt)是加载和注册任务。可能是这样的:

/**
 * public API
 *
 * add all required settings to grunt
 * 
 * register task "dist" and task "doc"
 *
 * @param  {object} grunt   the grunt instance
 * @return {void}
 */
function init(grunt) {
    // overwrite platform specific setting get always unix like line feed char
    grunt.util.linefeed = '\n';

    // Load plugins provide necessary task.
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-less');

    grunt.registerTask('dist', ['clean:build', 'copy:build', 'copy:dist', 'uglify', 'less']);
    grunt.registerTask('doc', ['clean:doc', 'copy:doc']);
}

getConfig(grunt, options)将构建并返回配置对象:

/**
 * public API
 *
 * will return a config object that have to be given as argument to "grunt.initConfig"
 *
 * @param  {object} grunt   the grunt instance
 * @param  {object|undefined} options to change some pathes
 * @return {object}         the configuration object for initConfig
 */
function getConfig(grunt, options) {

    options = options || {};

    var buildDir = options.buildDir || "build/";
    var distDir = options.distDir || "dist/";
    var docDir = options.docDir || "doc/";

    // ... doing some stuff to collect files or what ever ...

    return {
        clean: {
            build: {
                src: [buildDir]
            },
            doc: {
                src: [docDir]
            }
        },
        copy: {
            // ...
        }   
        // ... add here all the stuff you like to config ...
    };
}

而且,Gruntfile.js您的主题项目中的 可能非常短,并且不需要您的核心应用程序的所有内容。它可能是这样的:

/**
 * Module dependencies.
 */
var gruntMyApp = require("../my-app/grunt-my-app-core.js");

/*global module:false*/
module.exports = function(grunt) {

    var config = gruntMyApp.getConfig(grunt);

    // ... extend config, if you need it

    grunt.initConfig(config);

    // will register Task "dist" and "doc"
    gruntMyApp.init(grunt);

    // Default task.
    grunt.registerTask('default', ['dist', 'doc']);
};

现在,如果您更改核心应用程序上的某些内容,所有主题都会得到这个。您唯一需要更新手册的是devDependencies文件中的package.json

于 2014-03-14T15:21:02.987 回答
1
grunt.initConfig({
    clean: {/!* clean task configuration *!/},
    copy: {/!* copy task configuration *!/},
    compass: {/!* compass task configuration *!/},
    cssmin: {/!* cssmin task configuration *!/}
});

grunt.registerTask('theme', function () {
    var tasks = [
            'clean',
            'copy',
            'compass',
            'cssmin'
    ];

    tasks.forEach(function (task) {
        grunt.task.run(task);
    });
});
于 2015-09-15T12:57:38.700 回答