我在我的项目中使用Grunt concat。我想在文件夹级别上合并文件。E.G。
js >
parent >
child1 >
a.js
b.js
c.js
child2 >
a.js
b.js
进入:
js >
parent >
child1 >
child1combined.js
child2 >
child2combined.js
有没有这样一种方法,而不必在自己的concat行中专门添加每个“子”?
我最终做了this post中发现的以下内容。
grunt.registerTask("taskName", "Task Description", function() {
// get all module directories
grunt.file.expand("src/js/parent/*").forEach(function (dir) {
// get the module name from the directory name
var dirName = dir.substr(dir.lastIndexOf('/')+1);
// get the current concat object from initConfig
var concat = grunt.config.get('concat') || {};
// create a subtask for each module, find all src files
// and combine into a single js file per module
concat[dirName] = {
src: [dir + '/**/*.js'],
dest: 'build/js/parent/' + dirName + '/combined.js'
};
// add module subtasks to the concat task in initConfig
grunt.config.set('concat', concat);
});
});
然后只需从您的registerTask调用taskName。
在连续任务中使用globbing patterns。引用链接的文档:
单独指定所有源文件路径通常是不切实际的,因此Grunt支持文件名扩展(也称为globing)。
我知道这个话题很老,但是我想分享我的解决方案,因为我找不到一个可以在网络上正常工作的简单解决方案。
concat: {
files: [
{
expand: true,
src: ["**/*.js"],
dest: "dest/js",
cwd: "src/js",
rename: function(dst, src) {
const srcParts = String(src).split("/");
let dstPath = "";
let dstName = srcParts[0].split(".")[0];
if (srcParts.length > 1) {
dstName = srcParts[srcParts.length - 2];
dstPath =
srcParts
.slice(0, srcParts.length - 1)
.join("/") + "/";
}
return `${dst}/${dstPath + dstName}.js`;
}
}
]
}
我希望这对某人有帮助:)