我想说我要替换一堆文件中的版本号,其中许多文件存在于子目录中。我将通过gulp-replace管道文件来运行regex-replace函数;但我最终想要覆盖所有原始文件。
任务可能如下所示:
gulp.src([
'./bower.json',
'./package.json',
'./docs/content/data.yml',
/* ...and so on... */
])
.pipe(replace(/* ...replacement... */))
.pipe(gulp.dest(/* I DONT KNOW */);
那么我怎样才能结束它以使每个src
文件在其原始位置覆盖自己?我可以传递给gulp.dest()
这样做吗?
答案 0 :(得分:39)
我可以想到两个解决方案:
为base
添加gulp.src
选项,如下所示:
gulp.src([...files...], {base: './'}).pipe(...)...
这将告诉gulp保留整个相对路径。然后将'./'
传递到gulp.dest()
以覆盖原始文件。 (注意:这是未经测试的,您应该确保备份,以防它无法正常工作。)
使用功能。 Gulp只是JavaScript,所以你可以这样做:
[...files...].forEach(function(file) {
var path = require('path');
gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
}
如果你需要异步运行它们,第一个将更容易,因为你需要使用类似event-stream.merge
的东西并将流映射到数组中。它看起来像
var es = require('event-stream');
...
var streams = [...files...].map(function(file) {
// the same function from above, with a return
return gulp.src(file) ...
};
return es.merge.apply(es, streams);
答案 1 :(得分:14)
告诉gulp写入相关文件的基本目录,就像这样:
.pipe(
gulp.dest(function(data){
console.log("Writing to directory: " + data.base);
return data.base;
})
)
(数据参数为a vinyl file object)
这种方法的优点是,如果您拥有来自多个源的文件,每个文件都嵌套在文件结构的不同级别,则此方法允许您正确覆盖每个文件。 (如同在管道链的上游设置一个基目录一样)
答案 2 :(得分:0)
如果您使用gulp-rename
,则这是另一种解决方法:
var rename = require('gulp-rename');
...
function copyFile(source, target){
gulp.src(source)
.pipe(rename(target))
.pipe(gulp.dest("./"));
}
copyFile("src/js/app.js","dist/js/app.js");
如果您希望源和目标是绝对路径,
var rename = require('gulp-rename');
...
function copyFile(source, target){
gulp.src(source.replace(__dirname,"."))
.pipe(rename(target.replace(__dirname,".")))
.pipe(gulp.dest("./"));
}
copyFile("/Users/me/Documents/Sites/app/src/js/app.js","/Users/me/Documents/Sites/app/dist/js/app.js");
答案 3 :(得分:0)
我不确定为什么人们会使其复杂化,但是只需使用"./"
开始您的目标路径即可。
说路径为'dist/css'
,则可以这样使用
.pipe(gulp.dest("./dist/css"));
就是这样,我在每个项目中都使用这种方法。