我有一个 grunt 文件,我用它来构建我的网络应用程序。
此 grunt 文件使用多个 grunt 个约翰插件,如clean
,copy
,compass
,cssmin
,等,以正确构建网络应用程序。
这个 grunt 文件也应该处理生成CSS和复制文件以创建主题CSS文件。目前,我正在为每个主题的clean
,copy
和compass
(等)任务添加目标。
这在grunt文件中变得笨拙,并且在添加新主题时会使其变得困难且容易出错。
为了简化操作,我真的想创建自己的自定义“主题” grunt 任务,该任务将在内部使用其他 grunt contrib任务({{1 }},clean
,copy
等)执行指定主题的所有必要任务。
对于主题(主要是其源文件夹)只有少量的配置数据,我将有足够的信息来调用其他任务(因为主题源和目标文件是非常常规驱动的)。
我似乎找不到从我的自定义任务中调用任务的方法,我可以在其中以编程方式指定所有配置选项,文件等。
有谁知道我该怎么做?
谢谢,Ed
答案 0 :(得分:8)
我似乎找不到从自定义任务中调用任务的方法 在哪里我可以做到并指定所有配置选项,文件等。 编程。
我不认为您可以使用特定配置运行grunt多任务,因为从任务配置中指定的目标读取多任务配置。
所以这样做的一种方法是在运行之前修改任务配置。
这是一个非常基本的例子:
grunt.registerMultiTask('theme', function() {
var themeName = this.options().name;
grunt.config.set('yourOtherTask.dist.options.name', themeName);
grunt.task.run('yourOtherTask');
});
答案 1 :(得分:5)
这很简单:
concat: {
web: {
src: ['web/**/*.js'],
dest: 'dist/main.js'
}
},
uglify: {
server: {
src: '<%= concat.web.dest %>',
dest: '<%= concat.web.dest %>.min.js'
}
},
答案 2 :(得分:1)
我遇到了同样的问题并解决了它。
请记住:grunt是在节点中运行的所有JavaScript,因此您可以执行JavaScript和节点支持的任何事情。
我的解决方案是这样的:
首先,将所有内容放在核心应用程序的grunt中,例如单独的JavaScript文件&#34; grunt-my-app-core.js&#34;。
在该导出中有两个函数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
。
答案 3 :(得分: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);
});
});