Node.js Gulp能否覆盖所有src文件?
假设我想替换一堆文件中的版本号,其中许多文件位于子目录中。我将通过管道传输文件以运行regex replace函数;但我最终会想覆盖所有原始文件 任务可能如下所示:Node.js Gulp能否覆盖所有src文件?,node.js,automation,overwrite,gulp,Node.js,Automation,Overwrite,Gulp,假设我想替换一堆文件中的版本号,其中许多文件位于子目录中。我将通过管道传输文件以运行regex replace函数;但我最终会想覆盖所有原始文件 任务可能如下所示: gulp.src([ './bower.json', './package.json', './docs/content/data.yml', /* ...and so on... */ ]) .pipe(replace(/* ...replacement... */)) .pipe(gu
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()
的方法可以做到这一点吗?我可以想出两种解决方案:
base
选项添加到gulp.src
中,如下所示:
gulp.src([...files...], {base: './'}).pipe(...)...
这将告诉gulp保留整个相对路径。然后将'./'
传递到gulp.dest()
以覆盖原始文件。(注意:这是未经测试的,您应该确保您有一个备份,以防它不起作用。)[...files...].forEach(function(file) {
var path = require('path');
gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
}
如果您需要异步运行这些程序,那么第一个程序会容易得多,因为您需要使用类似事件流。合并并将流映射到一个数组中。看起来像
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);
告诉gulp写入相关文件的基本目录,如下所示:
.pipe(
gulp.dest(function(data){
console.log("Writing to directory: " + data.base);
return data.base;
})
)
(数据参数为)
这种方法的优点是,如果您的文件来自多个源,每个源都嵌套在文件结构的不同级别,那么这种方法允许您正确地覆盖每个文件。(用于在管道链上游设置一个基本目录)如果您使用的是
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");
我不知道为什么人们会把它复杂化,但只要用
“/”
开始你的目标路径就可以了
假设路径是'dist/css'
,那么您可以这样使用它
.pipe(gulp.dest(“./dist/css”)代码>
就是这样,我在我的每个项目上都使用这种方法。您要更改的文件是.json
文件?还是明文?您可以为每个要更改的文件运行gulp.src()…
。是的,但这正是我想要避免的:为每个单独的文件指定gulp.src()
,并通过其自己的regex replace对每个文件进行管道传输,事实上,这是相同的。相反,我想使用一系列全局模式。如果
,你可以使用gulp来实现某些功能,但只要源文件不在同一个文件夹中,我认为你不可能在一次调用中实现这一功能。#1对我来说很有用!谢谢在《大口大口大口》的任何地方都没有解释,是吗?你说得对。base
选项来自glob-stream
包,它来自vinyl-fs
包,该包都是gulp.src
is。这不容易追踪。哦,亲爱的上帝,如果新构建的内容比文件中以前的数据短,那么旧内容的结尾将保留在te文件中。换句话说,文件在写入之前不会被截断…必须“喜欢那些未记录的特性!”!谢谢你!到处找!