在Gulp中如何从字符串创建文件?

hzbexzde  于 2022-12-16  发布在  Gulp
关注(0)|答案(9)|浏览(220)

在我的gulpfile中,我有一个字符串形式的版本号。我想把版本号写入一个文件。在Gulp中有没有好的方法可以做到这一点,或者我应该看看更通用的NodeJS API?

3z6pesqy

3z6pesqy1#

如果你想用一种类似 Gulp 的方式来完成这个过程,你可以创建一个“假”黑胶文件流,并像往常一样调用pipe。下面是一个创建流的函数。“stream”是一个核心模块,所以你不需要安装任何东西:

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/'))
})
ej83mcc0

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(...)之前使用以下代码:

require('fs').writeFileSync('dist/build-date.txt', new Date());
tpgth1q7

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'));
});
qzlgjiam

qzlgjiam4#

根据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

kx7yvsdv

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.task('version', function () {
    var pkg = require('package.json')

    return file('version', pkg.version, {src: true})
        .pipe(gulp.dest('build/'))
});
ejk8hzay

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对象。

14ifxucb

14ifxucb7#

使用string-to-streamvinyl-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'));
gt0wga4j

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(文件)

dgsult0t

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');

相关问题