我已经问了这个问题的简化版本,但答案对我的大问题不起作用,所以我要在这里发布整个事情,看看是否有任何问题。
项目结构
我有许多项目可以使用,所有项目共享这样的结构(比这更多的孩子目标/子级别,但你明白了):
|-build
|-sub_EN_01
|-assets
|-image.jpg
|-file_EN.txt
|-sub_EN_02
|-assets
|-image.jpg
|-file_EN.txt
启动新项目时,我想将build
的内容复制到新目录,然后运行一项任务,将两个文件中的EN
的所有实例都更改为FR
/ dir名称和文件内容。
复制并重命名
我写的任务很好。像gulp copy-dirs --match EN --replacement FR
这样的调用指定哪些字符串应该替换哪些字符串并且一切都很好但是在原始的EN
文件旁边留下了新的FR
文件:
var gulp = require("gulp");
var foreach = require("gulp-foreach");
var args = require("yargs").argv;
var rename = require("gulp-rename");
var replace = require("gulp-replace-task");
gulp.task("copy-dirs", function(){
return gulp.src("./build/*"+args.match+"*")//Original parent dirs to copy
.pipe(foreach(function(pDirStream, pDirFile){//Loop parent dirs
var newDirName = pDirFile.relative.replace(args.match, args.replacement);//Name of parent dir with replacement applied
gulp.src("./build/"+pDirFile.relative+"/**/*")//Get contents of dir
.pipe(foreach(function(childStream, childFile){//Loop child files
var newFileName = childFile.relative.replace(args.match, args.replacement);//Name of child with replacement applied
childStream.pipe(replace({usePrefix: false, patterns:[
{
match: args.match,
replacement: args.replacement
}
]}))
.pipe(rename(newFileName));
return childStream;
}))
.pipe(gulp.dest("./build/"+newDirName));//Save it to new location
return pDirStream;
}));
});
清理
所以,我编写了第二个小任务来清理,如果我再调用gulp clean --match EN
并清除原来的EN
文件:
var del = require("del");
gulp.task("clean", function(){
return del(["./build/*"+args.match+"*/**"]);
});
问题
轰!完成。除此之外,只有在我运行copy-dirs
然后手动运行clean
时才有效。我想做的就是按照这样排序:
gulp.task("project-rename", ["clean"]);
gulp.task("clean", ["copy-dirs"], function(){
return del(["./build/*"+args.match+"*/**"]);
});
..但是当我尝试这个并打电话给gulp project-rename --match EN --replacement FR
时,我得到了Error: ENOENT, lstat
跟随资产的文件路径,并留下了一半的复制/删除项目。
黑客
我设法通过使用gulp-wait
在copy-dirs
结束时暂停一秒来解决问题,但这只是感觉非常hacky所以我想问:
clean
任务失败?谢谢
如果你到了这里,那么你是一个比我更好的人。我知道这是一个邮件的野兽,但我试图尽我所能解释它。我喜欢gulp
提供的内容,但我无法理解它在一个比单个任务更复杂的情况下的实际工作方式。我们将非常感激地收到任何建议。
你沮丧的绝望:)
答案 0 :(得分:2)
你正在尝试做Gulp及其插件应该为你做的事情。
我基于您对自己想要做的事情的散文描述,而不是您展示的代码,我的基础解决方案如下,因此它的行为可能有点不同。我已经对代码进行了评论,以解释它的作用。此外,我已经使用文件树对其进行了测试,该文件树复制了您在问题中显示的内容并发现它可以正常工作。有一点我做的不同,但你似乎想要的是我不希望gulpfile.js
获取其初始输入并将其最终输出写入同一目录。这对我来说似乎很危险。
var gulp = require("gulp");
var args = require("yargs").argv;
var rename = require("gulp-rename");
var replace = require("gulp-replace-task");
var del = require("del");
var gulpFilter = require('gulp-filter');
var match = args.match;
var replacement = args.replacement;
var match_re = RegExp(match, "g");
gulp.task("copy-dirs", function () {
// Set a filter that we'll use later. We have `restore: true` so
// that we can restore the stream to its original set of files
// after we are done with the filter.
var filter = gulpFilter("**/*.txt", {restore: true});
// We match all descendants of any directory in ./build that has
// the string specified by `match` in it.
return gulp.src("./build/*" + match + "*/**")
// In file paths every instance of the string contained by the
// `match` option will be replaced with the string specified by
// the `replacement` option.
.pipe(rename(function (path) {
path.dirname = path.dirname.replace(match_re, replacement);
path.basename = path.basename.replace(match_re, replacement);
// If you really want to change extensions, you'll also
// have to process path.ext.
}))
// Filter it down to only the files for which text replacement
// makes sense.
.pipe(filter)
.pipe(replace({usePrefix: false, patterns:[
{
match: match,
replacement: replacement
}
]}))
// Go back to the whole set of files so that we can store them.
.pipe(filter.restore)
.pipe(gulp.dest("./build"));
});
gulp.task("clean", ["copy-dirs"], function(){
return del(["./build/*"+match+"*/**"]);
});
gulp.task("project-rename", ["clean"]);