In meiner Gulpfile habe ich eine Versionsnummer in einer Zeichenfolge. Ich möchte die Versionsnummer in eine Datei schreiben. Gibt es eine gute Möglichkeit, dies in Gulp zu tun, oder sollte ich mir allgemeinere NodeJS-APIs ansehen?
74
Antworten:
Wenn Sie dies schluckartig tun möchten, können Sie einen Stream von "gefälschten" Vinyl-Dateien erstellen und wie
pipe
gewohnt aufrufen . Hier ist eine Funktion zum Erstellen des Streams. "stream" ist ein Kernmodul, Sie müssen also nichts installieren: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 }
Sie können es so verwenden:
gulp.task('version', function () { var pkg = require('package.json') return string_src("version", pkg.version) .pipe(gulp.dest('build/')) })
quelle
_read
für jede Datei wiederholen . In diesem Fall wäre ein Array von Dateiobjekten ein besserersting_src
Parameter.Buffer
einen globalen Knoten bereit ( nodejs.org/api/buffer.html ).this.push(null)
wirft aber einen Fehlerstream.push() after EOF
für mich auf, nicht sicher warum. Das Auskommentieren dieser Zeile funktioniert, aber dann hängt der Schluck auf unbestimmte Zeit.Es ist so ziemlich ein Einzeiler im Knoten:
require('fs').writeFileSync('dist/version.txt', '1.2.3');
Oder von package.json:
var pkg = require('./package.json'); var fs = require('fs'); fs.writeFileSync('dist/version.txt', 'Version: ' + pkg.version);
Ich verwende es, um ein Erstellungsdatum in einer leicht zugänglichen Datei anzugeben, daher verwende ich diesen Code vor dem
return gulp.src(...)
in derbuild
Aufgabe üblichen :require('fs').writeFileSync('dist/build-date.txt', new Date());
quelle
writeFile
Die Funktion ist jetzt asynchron und erfordert einen Rückruf. Möglicherweise möchten Sie 'writeFileSync' verwenden oder besser reaktiv sein und einen Rückruf übergeben, um etwas zu tun, wenn die Datei tatsächlich auf die Festplatte geschrieben ist.gulp.src('dist/version.txt').pipe(…)
nach der.writeFileSync
Zeile hinzufügen .Dies kann auch mit Vinyl-Source-Stream erfolgen . Siehe dieses Dokument im Gulp-Repository.
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')); });
quelle
.pipe()
process.nextTick(fn() { stream.end(); }
?process.nextTick
Rückruf beendet, weil dies in der gulp-Dokumentation so gemacht wurde. Es scheint nicht notwendig zu sein, deshalb habe ich die Antwort aktualisiert. Vielen Dank für den Hinweis.Laut dem Betreuer von Gulp ist die bevorzugte Methode zum Schreiben einer Zeichenfolge in eine Datei die Verwendung
fs.writeFile
des Task-Rückrufs.var fs = require('fs'); var gulp = require('gulp'); gulp.task('taskname', function(cb){ fs.writeFile('filename.txt', 'contents', cb); });
Quelle: https://github.com/gulpjs/gulp/issues/332#issuecomment-36970935
quelle
Sie können auch gulp-file verwenden :
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/')) });
oder ohne Verwendung
gulp.src()
:gulp.task('version', function () { var pkg = require('package.json') return file('version', pkg.version, {src: true}) .pipe(gulp.dest('build/')) });
quelle
Das gulp-header- Paket kann verwendet werden, um Dateien mit Header-Bannern voranzustellen.
z.B. Dadurch wird ein Banner in den Header Ihrer Javascript-Dateien eingefügt.
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 ist ein Streaming-Build-System, das Pipes nutzt.
Wenn Sie einfach eine neue Datei mit einer beliebigen Zeichenfolge schreiben möchten, können Sie das integrierte Knoten-fs- Objekt verwenden.
quelle
Hier ist eine Antwort, die 2019 funktioniert.
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); }
Und in Ihrer Schluck-Pipeline:
gulp.src([ ... ]) .pipe(stringSrc('version.json', '123')) .pipe(gulp.dest(destinationPath))
Aus der Quelle: https://github.com/gulpjs/gulp/tree/master/docs/writing-a-plugin#modifying-file-content
quelle
Verwenden der String-to-Stream- und Vinyl-Source-Stream- Module:
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'));
quelle
Dies kann auch mit einem Schluckhahn erreicht werden
Dies kann besonders hilfreich sein, wenn Sie mehrere Dateien identifiziert haben, für die dieser Header erforderlich ist. Hier ist relevanter Code (auch aus der Gulp-Tap-Dokumentation)
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');
quelle