gulp-assemble & gulp-注意当对数据、包含或布局进行更改时不重新编译站点

gulp-assemble & gulp-watch not recompiling site when changes are made to data, includes or layouts

我在使用 gulp-assemblegulp-watch 时遇到问题。我希望 gulp 观看整个 assemble 源目录(dataincludeslayoutspages)并在任何时候重新编译站点文件更改。

我能够让 pages 正常工作,但是 gulp 在对 dataincludeslayouts 个文件。

我已将 watch 任务添加到 gulp-assemble 存储库中的 example gulpfile.js

var gulp = require('gulp');
var htmlmin = require('gulp-htmlmin');
var extname = require('gulp-extname');
var assemble = require('assemble');
var middleware = require('./examples/middleware');
var gulpAssemble = require('./');

// setup items on the assemble object
assemble.data({site: {title: 'Blog'}});
assemble.data(['test/fixtures/data/*.{json,yml}']);
assemble.layouts(['test/fixtures/layouts/*.hbs']);
assemble.partials(['test/fixtures/includes/*.hbs']);

// arbitrary middleware that runs when files loaded
assemble.onLoad(/index\.hbs/, middleware(assemble));

// render templates in `test/fixtures`
gulp.task('default', function () {
  gulp.src('test/fixtures/pages/*.hbs')
    .pipe(gulpAssemble(assemble, { layout: 'default' }))
    .pipe(htmlmin({collapseWhitespace: true}))
    .pipe(extname())
    .pipe(gulp.dest('_gh_pages/'));
});

// ============================================================
// my watch task
// ============================================================
gulp.task('watch', ['default'], function() {
  gulp.watch('test/fixtures/**/*.{hbs,yml,json}', ['default']);
});

如果我 运行 gulp watch 并将更改保存到 pages 目录中的任何 .hbs 文件,我看到 gulp 触发 default 在我的终端输出中,我看到 _gh_pages 中的 .html 文件随着更改而更新。

但是,如果我将更改保存到 dataincludeslayouts 目录,我看到 gulp 在我的终端输出中触发了 default,但是我看到 _gh_pages .html 文件没有变化。我必须手动 运行 gulp default 任务才能将更改应用到 _gh_pages 文件。

我需要更改什么才能获得所需的行为?

gulp-watch 只会在默认任务的函数内部执行代码,因此要重新加载数据和布局等内容,您需要将这些代码块移动到函数内部(就在 gulp.src).

之前
var gulp = require('gulp');
var htmlmin = require('gulp-htmlmin');
var extname = require('gulp-extname');
var assemble = require('assemble');
var middleware = require('./examples/middleware');
var gulpAssemble = require('./');

// arbitrary middleware that runs when files loaded
assemble.onLoad(/index\.hbs/, middleware(assemble));

// render templates in `test/fixtures`
gulp.task('default', function () {
  // setup items on the assemble object
  assemble.data({site: {title: 'Blog'}});
  assemble.data(['test/fixtures/data/*.{json,yml}']);
  assemble.layouts(['test/fixtures/layouts/*.hbs']);
  assemble.partials(['test/fixtures/includes/*.hbs']);

  gulp.src('test/fixtures/pages/*.hbs')
    .pipe(gulpAssemble(assemble, { layout: 'default' }))
    .pipe(htmlmin({collapseWhitespace: true}))
    .pipe(extname())
    .pipe(gulp.dest('_gh_pages/'));
});

// ============================================================
// my watch task
// ============================================================
gulp.task('watch', ['default'], function() {
  gulp.watch('test/fixtures/**/*.{hbs,yml,json}', ['default']);
});