Verwenden einer Gulp-Task-Ausgabe innerhalb einer anderen Task
Ich habe zwei Schluckaufgaben wie folgt:
gulp.task("merge-json", () => {
return gulp
.src(
[
src_folder + "/modules/**/*.json",
src_folder + "/organisms/**/*.json",
src_folder + "/pages/**/*.json",
],
{
since: gulp.lastRun("merge-json"),
}
)
.pipe(plumber())
.pipe(merge({fileName: "data.json"}))
.pipe(gulp.dest(src_folder + "/datas/dist/"))
.pipe(browserSync.stream());
});
gulp.task("nunjucks", () => {
return gulp
.src([src_folder + "pages/**/*.njk"], {
base: src_folder + "pages",
since: gulp.lastRun("nunjucks"),
})
.pipe(plumber())
.pipe(data(() => JSON.parse(fs.readFileSync(src_folder + "datas/dist/data.json"))))
.pipe(nunjucks({path: src_folder}))
.pipe(gulp.dest(dist_folder))
.pipe(browserSync.stream());
});
Die erste Aufgabe verwendet das Merge-JSON-Plugin, um alle JSON-Dateien zu einer einzigen Datei namens data.json zusammenzuführen. Diese data.json wird dann vom gulp-nunjucks-render-Plugin zum Generieren von HTML-Seiten verwendet.
Das Problem, das ich hier habe, ist, dass in meinem Projekt src eine Datei namens data.json generiert wird, die nur für das Nunjucks-Plugin verwendet wird.
Meine Frage ist: Gibt es keine Möglichkeit, die Ausgabe des Merge-Json-Plugins (data.json) direkt im Nunjucks-Plugin zu verwenden?
Antworten
Dies ist nicht unbedingt eine ideale Lösung, aber ich werde es trotzdem hier lassen.
Führen Sie map-streammit eine neue Phase in die Pipeline ein, die den Inhalt des zusammengeführten JSON-Dateipuffers abfängt und in einer gemeinsam genutzten Variablen speichert.
const map = require('map-stream');
// a variable to store the merged JSON string
let mergedJsonString;
gulp.task("merge-json", () => {
return gulp
.src(
[
src_folder + "/modules/**/*.json",
src_folder + "/organisms/**/*.json",
src_folder + "/pages/**/*.json",
],
{
since: gulp.lastRun("merge-json"),
}
)
.pipe(plumber())
.pipe(merge({fileName: "data.json"}))
// only one file should ever be passed - data.json
.pipe(map((file, callback) => {
// capture the file buffer as a string
mergedJsonString = file.contents.toString()
// pass on the file to the next pipe, unmodified
callback(null, file)
}))
// can optionally be removed if not necessary to save to a file anymore
.pipe(gulp.dest(src_folder + "/datas/dist/"))
.pipe(browserSync.stream());
});
Jetzt muss die nunjucksAufgabe geändert werden, um eine andere Datenquelle zu verwenden und eine Abhängigkeit von der Schluckaufgabe anzugeben. Die Datenquelle könnte stattdessen bedingt generiert werden, um eine alte zwischengespeicherte Version zu verwenden, wenn die merge-jsonAufgabe nicht zuvor ausgeführt wird. z.BJSON.parse(typeof mergedJsonString !== "undefined" ? mergedJsonString : fs.readFileSync(src_folder + "datas/dist/data.json"))
// optionally use gulp.series to create a task dependency on "merge-json", ensuring it runs prior to the "nunjucks" task
gulp.task("nunjucks", gulp.series(["merge-json"], () => {
return gulp
.src([src_folder + "pages/**/*.njk"], {
base: src_folder + "pages",
since: gulp.lastRun("nunjucks"),
})
.pipe(plumber())
// source the JSON from a variable in memory; or if undefined, maybe change the implementation to use an old cached "/data/dists/data.json" file
.pipe(data(() => JSON.parse(mergedJsonString)))
.pipe(nunjucks({path: src_folder}))
.pipe(gulp.dest(dist_folder))
.pipe(browserSync.stream());
});
Möglicherweise sind einige kleinere Änderungen für Ihren speziellen Anwendungsfall erforderlich , dies entspricht jedoch dem Anwendungsfall, auch wenn es sich um einen Hacky handelt.