我阅读了Grunt官方文档和这篇文章respective file name
不幸的是,我没有得到答案
我有以下文件结构:
src/
modules/
module1/
static/
abc.js
def.js
......
module2/
static/
123.js
456.js
......
这是我的Gruntfile片段:
module1: {
options: {
idleading: 'module1/static/'
},
files: [
{
cwd: 'modules/module1/static',
src: '**/*.js',
dest: '.build/module1/static'
}
]
},
module2: {
options: {
idleading: 'module2/static/'
},
files: [
{
cwd: 'modules/module2/static',
src: '**/*.js',
dest: '.build/module2/static'
}
]
},
如你所见,两个目标非常相似,唯一的区别是“模块”名称,我们得到了大约20多个模块......所以将上述配置复制20次以上似乎太愚蠢了。
所以我的问题是:我能找到一种方法来编写一个函数,遍历所有目录,并提取模块名称,然后传递给像“cwd”,“dest”,“idleading”这样的配置?
请向我展示解决方案目录,非常感谢!
答案 0 :(得分:1)
grunt.registerTask('recursive_transport', 'recursive every directory, and perform transport task', function () {
var dirList = [];
var root = "applications";
(function walk(path) {
var items = fs.readdirSync(path);
items.forEach(function (item) {
if (fs.statSync(path + '/' + item).isDirectory()) {
dirList.push(path + '/' + item);
walk(path + '/' + item);
}
});
})(root);// search all directories
// exclude special directory
function isExcludeDir(dirName) {
if (dirName.indexOf('test') > -1) {
return true;
}
if (dirName.indexOf('service') > -1) {
return true;
}
if (dirName.indexOf('css') > -1) {
return true;
}
if (dirName.indexOf('html') > -1) {
return true;
}
if (dirName.indexOf('3rd-lib') > -1) {
return true;
}
return false;
}
dirList.forEach(function (item, index) {
item = item.substr((root + '/').length);// cut the leading path "applications/", then leaving "employee/static"
if (!isExcludeDir(item)) {
var targetName = "transport.build" + index;// such as 'transport.build0'
grunt.config.set(targetName + '.options.idleading', item + '/');
grunt.config.set(targetName + '.files', [
{
cwd: root + '/' + item,
src: '*.js',
dest: '.build/' + item
}
]);
grunt.task.run(targetName.replace('.', ':'));
}
});
});
答案 1 :(得分:0)
grunt.initConfig({
transport: {
modules: {
options: {
idleading: '<%= module %>/static/'
},
files: [
{
cwd: 'modules/<%= module %>/static',
src: '**/*.js',
dest: '.build/<%= module %>/static'
}
]
}
},
multi: {
modules: {
options: {
vars: {
modules: {
patterns: '*',
options: {
cwd: 'modules',
filter: 'isDirectory'
}
}
},
config: {
module: '<%= modules %>'
},
tasks: [ 'transport' ]
}
}
}
});
以grunt multi
运行您的任务,它将遍历modules
中的所有目录,为每个目录运行传输配置。
完整文档可在https://github.com/neekey/grunt-multi获得。希望这会有所帮助。