Dans mon gulpfile j'ai un numéro de version dans une chaîne. J'aimerais écrire le numéro de version dans un fichier. Existe-t-il une bonne façon de faire cela dans Gulp ou devrais-je envisager des API plus générales pour NodeJS?
Si vous souhaitez procéder de la sorte, vous pouvez créer un flux de "faux" disques vinyle et appeler pipe
par habitude. Voici une fonction pour créer le flux. "stream" est un module de base, vous n'avez donc rien à installer:
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
}
Vous pouvez l'utiliser comme ceci:
gulp.task('version', function () {
var pkg = require('package.json')
return string_src("version", pkg.version)
.pipe(gulp.dest('build/'))
})
C'est à peu près un one-liner dans le noeud:
require('fs').writeFileSync('dist/version.txt', '1.2.3');
Ou de package.json:
var pkg = require('./package.json');
var fs = require('fs');
fs.writeFileSync('dist/version.txt', 'Version: ' + pkg.version);
Je l'utilise pour spécifier une date de construction dans un fichier facilement accessible. J'utilise donc ce code avant l'habituel return gulp.src(...)
de la tâche build
:
require('fs').writeFileSync('dist/build-date.txt', new Date());
Cela peut aussi être fait avec vinyl-source-stream . Voir ce document dans le dépôt 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'));
});
Selon le responsable de Gulp, le moyen préféré pour écrire une chaîne dans un fichier est d'utiliser fs.writeFile
avec le rappel de la tâche.
var fs = require('fs');
var gulp = require('gulp');
gulp.task('taskname', function(cb){
fs.writeFile('filename.txt', 'contents', cb);
});
Source: https://github.com/gulpjs/gulp/issues/332#issuecomment-36970935
Vous pouvez également utiliser 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/'))
});
ou sans utiliser gulp.src()
:
gulp.task('version', function () {
var pkg = require('package.json')
return file('version', pkg.version, {src: true})
.pipe(gulp.dest('build/'))
});
Le paquetage gulp-header peut être utilisé pour préfixer les fichiers avec des bannières d’en-tête.
par exemple. Cela va injecter une bannière dans l'en-tête de vos fichiers 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 est un système de construction en continu utilisant les canaux.
Si vous voulez simplement écrire un nouveau fichier avec une chaîne arbitraire, vous pouvez utiliser un objet intégré node fs .
Utilisation des modules string-to-stream et 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'));
Voici une réponse qui fonctionne en 2019.
Plugin:
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);
}
Et dans votre pipe pipeline:
gulp.src([
...
])
.pipe(stringSrc('version.json', '123'))
.pipe(gulp.dest(destinationPath))
De la source: https://github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin#modifying-file-content
Le paramètre de fonction que vous passez à through.obj () est une fonction _transform qui agira sur le fichier d'entrée. Vous pouvez également fournir une fonction optionnelle _flush si vous devez émettre un peu plus de données à la fin du flux.
Dans votre fonction de transformation, appelez this.Push (fichier) au moins 0 fois pour transmettre les fichiers transformés/clonés. Vous n'avez pas besoin d'appeler this.Push (fichier) si vous fournissez toutes les sorties à la fonction callback ().
Appelez la fonction de rappel uniquement lorsque le fichier en cours (flux/tampon) est complètement utilisé. Si une erreur est rencontrée, transmettez-la en tant que premier argument au rappel, sinon définissez-la sur null. Si vous avez transmis toutes les données de sortie à this.Push (), vous pouvez omettre le deuxième argument du rappel.
Généralement, un plugin gulp mettrait à jour les fichiers.contenu, puis choisirait soit:
call callback (null, file) ou faire un appel à this.Push (file)
Ceci peut également être réalisé en utilisant gulp-tap
Cela peut être particulièrement utile si vous avez identifié plusieurs fichiers nécessitant cet en-tête. Voici le code pertinent (également de la documentation 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');