В моем gulpfile у меня есть номер версии в строке. Я хотел бы написать номер версии в файл. Есть ли хороший способ сделать это в Gulp, или я должен смотреть на более общие NodeJS API?
Как создать файл из строки в Gulp?
Ответ 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 (файл)