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

Dar*_*ryl 71 node.js gulp

在我的gulpfile中,我有一个字符串中的版本号.我想将版本号写入文件.在Gulp中有一个很好的方法吗,或者我应该关注更一般的NodeJS API?

fre*_*nte 72

它几乎是节点中的单线程:

require('fs').writeFileSync('dist/version.txt', '1.2.3');
Run Code Online (Sandbox Code Playgroud)

或者从package.json:

var pkg = require('./package.json');
var fs = require('fs');
fs.writeFileSync('dist/version.txt', 'Version: ' + pkg.version);
Run Code Online (Sandbox Code Playgroud)

我正在使用它在一个易于访问的文件中指定构建日期,所以我return gulp.src(...)build任务中通常使用此代码:

require('fs').writeFileSync('dist/build-date.txt', new Date());
Run Code Online (Sandbox Code Playgroud)

  • 如何进行链接(管道?)来访问由此创建的文件?由于它更像是一个节点方法,因此我无法访问在同一构建任务中创建的文件. (2认同)
  • @beauXjames你可以使用[mjhasbach的解决方案](http://stackoverflow.com/a/30455405/288906)或者只需在`之后添加`gulp.src('dist/version.txt').pipe(...)`. writeFileSync`行. (2认同)
  • 爱它。我用它来生成一个随机字符串用作缓存破坏者。https://gist.github.com/cmeza/e5488609d09722bd2c82e954859f36cf (2认同)

小智 70

如果您想以类似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
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

gulp.task('version', function () {
  var pkg = require('package.json')
  return string_src("version", pkg.version)
    .pipe(gulp.dest('build/'))
})
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人对我不熟悉节点,则node提供"Buffer"作为全局(https://nodejs.org/api/buffer.html). (4认同)
  • 对于那些不熟悉流的人来说,你可以通过在每个文件的`_read`中重复两行来对多个文件字符串进行处理.在这个例子中,文件对象数组将是更好的`sting_src`参数. (2认同)

mjh*_*ach 28

这也可以用乙烯基源流完成.请参阅gulp存储库中的此文档.

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'));
});
Run Code Online (Sandbox Code Playgroud)


GOT*_*O 0 21

根据Gulp的维护者的说法,将字符串写入文件的首选方法是使用fs.writeFile任务回调.

var fs = require('fs');
var gulp = require('gulp');

gulp.task('taskname', function(cb){
  fs.writeFile('filename.txt', 'contents', cb);
});
Run Code Online (Sandbox Code Playgroud)

资料来源:https://github.com/gulpjs/gulp/issues/332#issuecomment-36970935


Dav*_*ler 14

你也可以使用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/'))
});
Run Code Online (Sandbox Code Playgroud)

或不使用gulp.src():

gulp.task('version', function () {
    var pkg = require('package.json')

    return file('version', pkg.version, {src: true})
        .pipe(gulp.dest('build/'))
});
Run Code Online (Sandbox Code Playgroud)


Mik*_*ser 5

一饮而尽头包可以使用头横幅前缀的文件.

例如.这将在您的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/')
Run Code Online (Sandbox Code Playgroud)

Gulp是一个利用管道的流媒体构建系统.

如果您只想编写带有任意字符串的新文件,则可以使用内置节点fs对象.