在另一个任务中使用 gulp 任务输出

Using a gulp task output inside another task

我有两个 gulp 任务如下:

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());
});

第一个任务使用 merge-json 插件将所有 json 文件合并为一个名为 data.json 的文件,然后这个 data.json 将被gulp-nunjucks-render 插件生成 html 页。

我这里的问题是在我的项目src中生成了一个名为data.json的文件,该文件将仅用于nunjucks插件。

我的问题是,有没有办法直接在 nunjucks 插件中使用 merge-json (data.json) 插件的输出?

这不一定是理想的解决方案,但我还是会把它留在这里。

使用 map-stream,在管道中引入一个新阶段,拦截合并的 JSON 文件缓冲区的内容并将其存储到共享变量中。

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());
});

现在需要修改 nunjucks 任务以使用不同的数据源并指定 gulp 任务依赖项。如果 merge-json 任务不是 运行 之前的,则可以有条件地生成数据源以使用旧的缓存版本;例如JSON.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());
});

可能需要针对您的特定用例进行一些小的调整,但这 确实 满足用例,即使它是 hacky。