在我的gulpfile中,我有一个字符串形式的版本号。我想把版本号写入一个文件。在Gulp中有没有好的方法可以做到这一点,或者我应该看看更通用的NodeJS API?
3z6pesqy1#
如果你想用一种类似 Gulp 的方式来完成这个过程,你可以创建一个“假”黑胶文件流,并像往常一样调用pipe。下面是一个创建流的函数。“stream”是一个核心模块,所以你不需要安装任何东西:
pipe
const Vinyl = require('vinyl') function string_src(filename, string) { var src = require('stream').Readable({ objectMode: true }) src._read = function () { this.push(new Vinyl({ cwd: "", base: "", path: filename, contents: Buffer.from(string, 'utf-8') })) this.push(null) } return src }
您可以像这样使用它:
gulp.task('version', function () { var pkg = require('package.json') return string_src("version", pkg.version) .pipe(gulp.dest('build/')) })
ej83mcc02#
它实际上是node中的一行代码:
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);
我使用它在一个易于访问的文件中指定构建日期,因此在build任务中,我在通常的return gulp.src(...)之前使用以下代码:
build
return gulp.src(...)
require('fs').writeFileSync('dist/build-date.txt', new Date());
tpgth1q73#
这也可以通过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')); });
qzlgjiam4#
根据Gulp的维护者的说法,将字符串写入文件的首选方法是使用fs.writeFile和任务回调。
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
kx7yvsdv5#
您也可以使用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.src()
gulp.task('version', function () { var pkg = require('package.json') return file('version', pkg.version, {src: true}) .pipe(gulp.dest('build/')) });
ejk8hzay6#
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对象。
14ifxucb7#
使用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'));
gt0wga4j8#
下面是一个在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 管道里:
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通过.obj()传递的函数参数是一个_transform函数,它将对输入文件进行操作,如果需要在流的末尾发出更多的数据,也可以提供一个可选的_flush函数。从您的transform函数中调用此.push(file)0次或更多次以沿着转换/克隆的文件。如果您将所有输出提供给callback()函数,则无需调用此.push(file)。仅当当前文件(流/缓冲区)完全用完时才调用回调函数。如果遇到错误,请将其作为回调函数的第一个参数传递,否则将其设置为null。如果已将所有输出数据传递到此.push(),则可以省略回调函数的第二个参数。一般来说,gulp插件会更新文件.contents,然后选择:调用callback(null,文件)或调用此.push(文件)
dgsult0t9#
这也可以使用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');
9条答案
按热度按时间3z6pesqy1#
如果你想用一种类似 Gulp 的方式来完成这个过程,你可以创建一个“假”黑胶文件流,并像往常一样调用
pipe
。下面是一个创建流的函数。“stream”是一个核心模块,所以你不需要安装任何东西:您可以像这样使用它:
ej83mcc02#
它实际上是node中的一行代码:
或者从package.json中:
我使用它在一个易于访问的文件中指定构建日期,因此在
build
任务中,我在通常的return gulp.src(...)
之前使用以下代码:tpgth1q73#
这也可以通过vinyl-source-stream来实现,请参见gulp库中的this document。
qzlgjiam4#
根据Gulp的维护者的说法,将字符串写入文件的首选方法是使用
fs.writeFile
和任务回调。图片来源:https://github.com/gulpjs/gulp/issues/332#issuecomment-36970935
kx7yvsdv5#
您也可以使用gulp-file:
或不使用
gulp.src()
:ejk8hzay6#
gulp-header软件包可用于在文件前添加标题横幅。
这会在你的javascript文件头中插入一个横幅。
Gulp是一个利用管道的流式构建系统。
如果你只是想写一个带有任意字符串的新文件,你可以使用内置的node fs对象。
14ifxucb7#
使用string-to-stream和vinyl-source-stream模块:
gt0wga4j8#
下面是一个在2019年行得通的答案。
插件:
在你的 Gulp 管道里:
来源:https://github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin#modifying-file-content
通过.obj()传递的函数参数是一个_transform函数,它将对输入文件进行操作,如果需要在流的末尾发出更多的数据,也可以提供一个可选的_flush函数。
从您的transform函数中调用此.push(file)0次或更多次以沿着转换/克隆的文件。如果您将所有输出提供给callback()函数,则无需调用此.push(file)。
仅当当前文件(流/缓冲区)完全用完时才调用回调函数。如果遇到错误,请将其作为回调函数的第一个参数传递,否则将其设置为null。如果已将所有输出数据传递到此.push(),则可以省略回调函数的第二个参数。
一般来说,gulp插件会更新文件.contents,然后选择:
调用callback(null,文件)或调用此.push(文件)
dgsult0t9#
这也可以使用gulp-tap来实现
如果你已经识别出多个需要这个头文件的文件,这会特别有帮助。下面是相关的代码(也来自gulp-tap文档)