【问题标题】:Gulp watch breaks production filesGulp watch 破坏了生产文件
【发布时间】:2017-04-12 06:13:36
【问题描述】:

但是,我遇到了一个问题,即运行我的 gulp watch 任务会破坏我的构建;这只发生在我编辑 .scss 文件并且 gulp 检测到更改时。

例如,样式已正确应用于我网站上的特定文档。我通过调用 gulp 开始观察我的资产。我运行gulp 来调用默认任务(它可以正确构建所有内容,连接我的资产等)

这不会破坏我的生产文件。直到我编辑文件(并且 gulp 检测到并再次运行必要的任务)才会发生这种情况。

这是我的 gulpfile

//Node dependencies 
var gulp = require('gulp'),
    minifyCSS = require('gulp-clean-css'),
    minifyJS = require('gulp-uglify'),
    rename = require('gulp-rename'),
    sass = require('gulp-sass'),
    pump = require('pump'),
    sync = require('run-sequence');

//Sass transpilation task
gulp.task('sass', function(cb) {
  pump([
    gulp.src('app/scss/*.scss'),
    sass(),
    gulp.dest('app/css')
  ], cb);
});

//Uglify CSS task
gulp.task('ugCSS', function(cb) {
  pump([
    gulp.src('app/css/*.css'),
    minifyCSS(),
    rename({
      suffix: ".min"
    }),
    gulp.dest('dist/css')
  ], cb);
});

//Uglify JS task
gulp.task('ugJS', function(cb) {
  pump([
    gulp.src('app/js/*.js'),
    minifyJS(),
    rename({
      suffix: ".min"
    }),
    gulp.dest('dist/js')
  ], cb);
});

//Watch task
gulp.task('watch', function() {
  return gulp.watch('app/scss/*.scss', ['default']);
});

//Default task to make sure everythings runs syncronously
gulp.task('default', function(callback) {
  sync('sass', 'ugCSS', 'ugJS', 'watch', callback);
});

如果我说的没有道理,我会系统地列出我是如何调用这个问题的。

  1. gulp:这会运行默认任务(这不会破坏样式)
  2. 在 ide 中编辑 .scss 文件:我想更改我的样式,所以我编辑了文件,gulp watch 任务检测到这一点并再次返回“默认”任务,重新开始循环再次。
  3. 打开浏览器并导航到站点以查看应用的样式:这是它中断的地方,我的所有样式都已删除,我的 css 的 'gulp.dest' 文件(我已经 uglified 并通过了到分发文件夹)是空白的。
  4. gulp:取消之前的 gulp 进程并再次运行它可以解决问题。导航回 /dist 中的 css 文件 - 所有样式都在那里。

长话短说,只有当我“主动”编辑.scss 文件并且 gulp watch 任务调用必要的任务将文件构建到生产文件夹中时,我的样式才会被删除,因此相关文档可以看到这些更改。

【问题讨论】:

  • 代替手表中的“默认”任务进行测试并仅运行“sass”作业以查看是否正确编译样式
  • 试过了,同样的事情。如果我像在 gulp sass 中那样自行运行 sass 任务 - 效果很好。如果我运行 watch 任务并且 watch 任务检测到更改然后运行 ​​sass 任务,那就是它中断的地方。
  • 我面临着类似的情况,我认为问题在于任务没有按顺序完成。很确定 'ugCSS' 在 'sass' 完成工作之前运行。
  • 嗯,这就是我包含“runSequence”模块的原因,所以我可以指定任务执行的顺序。看着 gulp 输出“开始和完成”的任务——它似乎以正确的顺序运行。
  • 我建议您不要在手表上调用默认值,因为默认值会启动手表,并且当您进行更改时会重复调用它。相反,只需列出您想要的任务,即。 ['sass','ugcss',等等..]。只是一个简短的说明,以使 gulp 中的写作不易出错。此外,我建议您在所有 gulp 任务中使用 gulp-plumber,这样您的流就不会因错误而中断。快速说明:您不需要在每个任务中包含函数(cb)并返回cb,您只需要使用运行序列,其他任务可以只是函数()。最佳

标签: javascript html css gulp gulp-watch


【解决方案1】:

我自己是 gulp 的新手,遇到了类似的问题,我通过查看:How to run Gulp tasks sequentially one after the other 解决了这个问题,您可以尝试以下方法:

//Sass transpilation task
gulp.task('sass', function() {
  return gulp.src('app/scss/*.scss') // return solved my problem
             .pipe(sass()/*.on('error', sass.logError)*/) // optional on error
             .pipe(dest('app/css'));
});

//Uglify CSS task
gulp.task('ugCSS', function() {
  return gulp.src('app/css/*.css')
             .pipe(minifyCSS())
             .pipe(rename({suffix: ".min"})
             .pipe(dest('dist/css'));
});

//Uglify JS task
gulp.task('ugJS', function() {
  return gulp.src('app/js/*.js')
             .pipe(minifyJS())
             .pipe(rename({suffix: ".min"})
             .pipe(dest('dist/js'));
});

//Watch task
gulp.task('watch', function() {
  return gulp.watch('app/scss/*.scss', ['default']);
});

//Default task to make sure everythings runs syncronously
gulp.task('default', function() {
  sync('sass', 'ugCSS', 'ugJS');
});

【讨论】:

  • 这并不能解决我的问题。我也尝试过返回链式方法,但这不起作用。此外,我通过使用他们在任务方法上提供的 gulps deps 参数来消除同步执行的问题。 github.com/gulpjs/gulp/blob/master/docs/API.md#deps 不过感谢您的建议!
  • 对不起,如果它不起作用,只是发布了对我有用的东西
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
相关资源
最近更新 更多