在我的gulpfile中,我在字符串中有一个版本号。我想将版本号写入文件。在Gulp中有一个很好的方法吗,或者我应该关注更一般的NodeJS API?
答案 0 :(得分:66)
它几乎是节点中的单行:
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());
答案 1 :(得分:65)
如果您想以类似gulp的方式执行此操作,则可以创建“假”乙烯基文件流并按常规调用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/'))
})
答案 2 :(得分:27)
这也可以使用vinyl-source-stream完成。请参阅gulp存储库中的this document。
var gulp = require('gulp'),
source = require('vinyl-source-stream');
gulp.task('some-task', function() {
var stream = source('file.txt');
stream.end('some data');
stream.pipe(gulp.dest('output'));
});
答案 3 :(得分:17)
根据Gulp的维护者的说法,将字符串写入文件的首选方法是使用fs.writeFile
和任务回调。
var btns = document.querySelectorAll('a.copy_btn');
var clipboard = new Clipboard(btns);
clipboard.on('success', function (e) {
console.log(e);
});
clipboard.on('error', function (e) {
console.log(e);
});
来源:https://github.com/gulpjs/gulp/issues/332#issuecomment-36970935
答案 4 :(得分:13)
您还可以使用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/'))
});
答案 5 :(得分:5)
gulp-header包可用于为带有标题横幅的文件添加前缀。
例如。这会在你的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是一个利用管道的流式构建系统。
如果您只想编写带有任意字符串的新文件,则可以使用内置的node fs对象。
答案 6 :(得分:2)
使用string-to-stream和vinyl-source-stream模块:
var str = require('string-to-stream');
var source = require('vinyl-source-stream');
var gulp = require('gulp');
str('1.4.27').pipe(source('version.txt')).pipe(gulp.dest('dist'));
答案 7 :(得分:1)
这也可以使用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');
答案 8 :(得分:0)
以下是在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,然后选择 要么:
调用回调(null,文件)或一次调用this.push(文件)