在我的gulpfile中,我在字符串中有一个版本号。我想将版本号写入文件。在Gulp中是否有一种很好的方法可以做到这一点,还是我应该看看更通用的NodeJS API?
Answers:
如果您想以类似口水的方式执行此操作,则可以创建“假”黑胶文件流并按pipe
常规方式调用。这是用于创建流的函数。“ stream”是一个核心模块,因此您不需要安装任何东西:
function string_src(filename, string) {
var src = require('stream').Readable({ objectMode: true })
src._read = function () {
this.push(new gutil.File({
cwd: "",
base: "",
path: filename,
contents: new Buffer(string)
}))
this.push(null)
}
return src
}
您可以像这样使用它:
gulp.task('version', function () {
var pkg = require('package.json')
return string_src("version", pkg.version)
.pipe(gulp.dest('build/'))
})
_read
每个文件中重复两行来对多个文件字符串进行处理。在这种情况下,文件对象数组将是一个更好的sting_src
参数。
this.push(null)
有用,但对我却引发错误stream.push() after EOF
,不知道为什么。注释掉该行是可行的,但随后gulp无限期挂起。
它几乎是节点中的一线:
require('fs').writeFileSync('dist/version.txt', '1.2.3');
或从package.json中获取:
var pkg = require('./package.json');
var fs = require('fs');
fs.writeFileSync('dist/version.txt', 'Version: ' + pkg.version);
我使用它在易于访问的文件中指定生成日期,因此我return gulp.src(...)
在执行build
任务之前使用此代码:
require('fs').writeFileSync('dist/build-date.txt', new Date());
writeFile
函数现在是异步的,需要回调。您可能想使用'writeFileSync'或更好地进行反应,并在文件实际写入磁盘时传递回调以执行某些操作。
.pipe()
process.nextTick(fn() { stream.end(); }
吗?
process.nextTick
回调中结束了流,因为这是在gulp文档中完成的。似乎没有必要,所以我更新了答案。感谢您指出了这一点。
根据Gulp的维护者,将字符串写入文件的首选方法是fs.writeFile
与任务回调一起使用。
var fs = require('fs');
var gulp = require('gulp');
gulp.task('taskname', function(cb){
fs.writeFile('filename.txt', 'contents', cb);
});
来源:https : //github.com/gulpjs/gulp/issues/332#issuecomment-36970935
您也可以使用gulp-file:
var gulp = require('gulp');
var file = require('gulp-file');
gulp.task('version', function () {
var pkg = require('package.json')
return gulp.src('src/**')
.pipe(file('version', pkg.version))
.pipe(gulp.dest('build/'))
});
或不使用gulp.src()
:
gulp.task('version', function () {
var pkg = require('package.json')
return file('version', pkg.version, {src: true})
.pipe(gulp.dest('build/'))
});
该一饮而尽头包可以使用头横幅前缀的文件。
例如。这会将标语注入到您的javascript文件的标题中。
var header = require('gulp-header');
var pkg = require('./package.json');
var banner = ['/**',
' * <%= pkg.name %> - <%= pkg.description %>',
' * @version v<%= pkg.version %>',
' * @link <%= pkg.homepage %>',
' * @license <%= pkg.license %>',
' */',
''].join('\n');
gulp.src('./foo/*.js')
.pipe(header(banner, { pkg: pkg } ))
.pipe(gulp.dest('./dist/')
Gulp是利用管道的流式构建系统。
如果您只想编写带有任意字符串的新文件,则可以使用内置节点fs对象。
这是2019年有效的答案。
插入:
var Vinyl = require('vinyl');
var through = require('through2');
var path = require('path');
// https://github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin#modifying-file-content
function stringSrc(filename, string) {
/**
* @this {Transform}
*/
var transform = function(file, encoding, callback) {
if (path.basename(file.relative) === 'package.json') {
file.contents = Buffer.from(
JSON.stringify({
name: 'modified-package',
version: '1.0.0',
}),
);
}
// if you want to create multiple files, use this.push and provide empty callback() call instead
// this.push(file);
// callback();
callback(null, file);
};
return through.obj(transform);
}
在您的吞咽管道中:
gulp.src([
...
])
.pipe(stringSrc('version.json', '123'))
.pipe(gulp.dest(destinationPath))
来源:https : //github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin#modifying-file-content
您通过through.obj()传递的函数参数是一个_transform函数,它将对输入文件进行操作。如果需要在流的末尾发出更多数据,则还可以提供可选的_flush函数。
从您的转换函数中调用this.push(file)0次或更多次以传递经过转换/克隆的文件。如果将所有输出提供给callback()函数,则无需调用this.push(file)。
仅在完全消耗了当前文件(流/缓冲区)后才调用回调函数。如果遇到错误,请将其作为第一个参数传递给回调,否则将其设置为null。如果已将所有输出数据传递给this.push(),则可以省略回调的第二个参数。
通常,gulp插件会更新file.contents,然后选择:
调用callback(null,file)或对此this进行一次调用
这也可以使用gulp-tap来实现
如果您确定了需要此标头的多个文件,这将特别有用。这是相关的代码(也来自gulp-tap文档)
var gulp = require('gulp'),
tap = require('gulp-tap');
gulp.src("src/**")
.pipe(tap(function(file){
file.contents = Buffer.concat([
new Buffer('Some Version Header', 'utf8'),
file.contents
]);
}))
.pipe(gulp.dest('dist');