Как создать файл из строки в Gulp?

В моем gulpfile у меня есть номер версии в строке. Я хотел бы написать номер версии в файл. Есть ли хороший способ сделать это в Gulp, или я должен смотреть на более общие NodeJS API?

Ответ 1

Если вы хотите сделать это с помощью 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

Это в значительной степени однострочный в 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);

Я использую его для указания даты сборки в легкодоступном файле, поэтому я использую этот код перед обычным return gulp.src(...) в задаче build:

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

Ответ 3

Это также можно сделать с помощью vinyl-source-stream. См. этот документ в репозитории 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'));
});

Ответ 4

По словам сопровождающего 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

Ответ 5

Вы также можете использовать 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/'))
});

Ответ 6

Пакет 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 - это система потоковой сборки, использующая трубы.

Если вы просто хотите написать новый файл с произвольной строкой, вы можете использовать встроенный в узел объект fs.

Ответ 7

Это также может быть достигнуто с помощью 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

Используя 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'));

Ответ 9

Здесь ответ, который работает в 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 (файл) 0 или более раз для передачи преобразованных/клонированных файлов. Вам не нужно вызывать this.push (файл), если вы предоставляете все выходные данные для функции callback().

Вызывайте функцию обратного вызова только тогда, когда текущий файл (поток/буфер) полностью используется. Если обнаружена ошибка, передайте ее в качестве первого аргумента обратному вызову, в противном случае установите для него значение null. Если вы передали все выходные данные в this.push(), вы можете опустить второй аргумент в обратном вызове.

Обычно плагин gulp обновляет файл file.contents и затем выбирает:

обратный вызов (ноль, файл) или один вызов this.push (файл)