У моєму gulpfile у мене є номер версії у рядку. Я хотів би записати номер версії у файл. Чи є хороший спосіб зробити це в Gulp, чи я повинен розглядати більш загальні API NodeJS?
У моєму gulpfile у мене є номер версії у рядку. Я хотів би записати номер версії у файл. Чи є хороший спосіб зробити це в Gulp, чи я повинен розглядати більш загальні API NodeJS?
Відповіді:
Якщо ви хочете зробити це залпом, ви можете створити потік "фальшивих" вінілових файлів і дзвонити 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/'))
})
_read
для кожного файлу. У цьому випадку масив файлових об'єктів буде кращим sting_src
параметром.
Buffer
як глобальний ( nodejs.org/api/buffer.html ).
this.push(null)
видає помилку stream.push() after EOF
для мене, не знаю, чому. Коментуючи, що рядок працює, але потім ковток зависає на невизначений час.
Це майже однорівневий вузол:
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());
writeFile
функція тепер асинхронна і вимагає зворотного виклику. Можливо, ви захочете використовувати 'writeFileSync' або краще реагувати і передати зворотний виклик, щоб зробити щось, коли файл фактично записаний на диск.
gulp.src('dist/version.txt').pipe(…)
після .writeFileSync
рядка.
Це також можна зробити за допомогою вінілового джерела-потоку . Дивіться цей документ у сховищі ковтків.
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'));
});
.pipe()
process.nextTick(fn() { stream.end(); }
?
process.nextTick
зворотним викликом, оскільки саме так це було зроблено в документації про ковтання. Здається, це не потрібно, тому я оновив відповідь. Дякуємо, що вказали на це.
На думку супровідника 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
Ви також можете використовувати gulp-файл :
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/'))
});
Пакет 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 node .
Ось відповідь, яка працює в 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
Параметр функції, який ви передаєте через .obj () - це функція _transform, яка буде працювати з вхідним файлом. Ви також можете надати додаткову функцію _flush, якщо вам потрібно випустити трохи більше даних в кінці потоку.
За допомогою функції перетворення викличте this.push (файл) 0 або більше разів, щоб передати перетворені / клоновані файли. Вам не потрібно викликати this.push (файл), якщо ви надаєте всі вихідні дані функції callback ().
Викликайте функцію зворотного виклику лише тоді, коли поточний файл (потік / буфер) повністю споживається. Якщо виявляється помилка, передайте її як перший аргумент зворотного виклику, інакше встановіть для неї значення null. Якщо ви передали всі вихідні дані в this.push (), ви можете пропустити другий аргумент для зворотного виклику.
Як правило, плагін gulp оновлює file.contents, а потім обирає:
виклик зворотного виклику (null, файл) або зробити один дзвінок на this.push (файл)
Використання модулів 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'));
Цього також можна досягти за допомогою залпового крана
Це може бути особливо корисно, якщо ви визначили кілька файлів, для яких потрібен цей заголовок. Ось відповідний код (також із документації про 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');