web-dev-qa-db-fra.com

Comment créez-vous un fichier à partir d'une chaîne dans Gulp?

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?

68
Daryl

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/'))
})
68
Christoph Neumann

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());
69
fregante

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'));
});
27
mjhasbach

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

19
GOTO 0

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/'))
});
13
Dave James Miller

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 .

5
Mike Causer

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'));
2
Jonas Berlin

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)

1
William Bernting

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');
1
Vikram