使用 gulp,监视任务是否保证在其他任务之前 运行?
With gulp, are watch tasks guaranteed to run before other tasks?
我有一个 gulp 监视任务,它使用 gulp-sass
将 SASS 转换为 CSS。对于开发,我只需要分隔 CSS 个文件。
为了发布,我有一个 min
任务,它使用 gulp-cssmin
和 concat
来捆绑和缩小 CSS。但是,min
任务不处理 SASS 文件。它假定它们已经转换为 CSS.
这是一个有效的假设吗?如果自动构建获取最新的源代码(没有 .scss 文件)和 运行s min
怎么办?这里是否存在关于 watch 任务是否会 运行 及时 min
获取 SASS 文件的竞争条件?
如果您的 min
任务也在监视 SASS 文件,则您的假设不一定有效。默认情况下,所有任务将同时 运行。然而,您可以在您的任务中定义依赖关系,这样一个任务在另一个任务完成之前不会开始。这可以解决您的问题。有关依赖项的文档可以在 here.
中找到
还有另外两种解决方案:
- 观看
min
任务的 CSS 个文件。
- 运行 编译 SASS.
任务结束时 min
任务中的逻辑
爱德华!最好使用可选的缩小来防止从磁盘额外读取。
var env = require('minimist')(process.argv.slice(2));
var noop = require('readable-stream/passthrough').bind(null, { objectMode: true });
gulp.task('style', function () {
return gulp.src('...')
.pipe(process())
.pipe(env.min ? uglify() : noop())
.pipe(gulp.dest('...'))
});
此外,我不推荐 gulp-util 中的这些工具,它们将被弃用
即使 gulp 保证它会在启动依赖任务之前等待监视任务完成,在从源文件更改到 OS 通知之间的时间间隔内仍可能发生竞争gulp。所以我决定不使用 SASS → CSS 转换输出。因为我很少需要构建最小化版本,所以节省这些毫秒没有任何回报。
相反,我使用 stream-combiner2
来重用转换逻辑:
var combiner = require('stream-combiner2');
function scssTransform() {
return combiner(
sourcemaps.init(),
sass(),
sourcemaps.write());
}
我将转换用于我的非模拟 "sandbox" 本地开发:
gulp.task('sandbox:css', function () {
return gulp.src(paths.scss)
.pipe(scssTransform())
.pipe(gulp.dest(dirs.styles));
});
我在本地为站点提供服务的任务取决于并监视任务:
gulp.task('serve.sandbox', ['sandbox:css' /* ... more ... */], function () {
// ... Start the web server ...
gulp.watch(paths.scss, ['sandbox:css']);
// ... Watch more stuff ...
});
我也将转换用于我的最小化部署:
gulp.task('deploy:css', function () {
return gulp.src(paths.scss)
.pipe(scssTransform())
.pipe(concat(files.cssMin))
.pipe(cssmin())
.pipe(gulp.dest(dirs.deploy));
});
我有一个 gulp 监视任务,它使用 gulp-sass
将 SASS 转换为 CSS。对于开发,我只需要分隔 CSS 个文件。
为了发布,我有一个 min
任务,它使用 gulp-cssmin
和 concat
来捆绑和缩小 CSS。但是,min
任务不处理 SASS 文件。它假定它们已经转换为 CSS.
这是一个有效的假设吗?如果自动构建获取最新的源代码(没有 .scss 文件)和 运行s min
怎么办?这里是否存在关于 watch 任务是否会 运行 及时 min
获取 SASS 文件的竞争条件?
如果您的 min
任务也在监视 SASS 文件,则您的假设不一定有效。默认情况下,所有任务将同时 运行。然而,您可以在您的任务中定义依赖关系,这样一个任务在另一个任务完成之前不会开始。这可以解决您的问题。有关依赖项的文档可以在 here.
还有另外两种解决方案:
- 观看
min
任务的 CSS 个文件。 - 运行 编译 SASS. 任务结束时
min
任务中的逻辑
爱德华!最好使用可选的缩小来防止从磁盘额外读取。
var env = require('minimist')(process.argv.slice(2));
var noop = require('readable-stream/passthrough').bind(null, { objectMode: true });
gulp.task('style', function () {
return gulp.src('...')
.pipe(process())
.pipe(env.min ? uglify() : noop())
.pipe(gulp.dest('...'))
});
此外,我不推荐 gulp-util 中的这些工具,它们将被弃用
即使 gulp 保证它会在启动依赖任务之前等待监视任务完成,在从源文件更改到 OS 通知之间的时间间隔内仍可能发生竞争gulp。所以我决定不使用 SASS → CSS 转换输出。因为我很少需要构建最小化版本,所以节省这些毫秒没有任何回报。
相反,我使用 stream-combiner2
来重用转换逻辑:
var combiner = require('stream-combiner2');
function scssTransform() {
return combiner(
sourcemaps.init(),
sass(),
sourcemaps.write());
}
我将转换用于我的非模拟 "sandbox" 本地开发:
gulp.task('sandbox:css', function () {
return gulp.src(paths.scss)
.pipe(scssTransform())
.pipe(gulp.dest(dirs.styles));
});
我在本地为站点提供服务的任务取决于并监视任务:
gulp.task('serve.sandbox', ['sandbox:css' /* ... more ... */], function () {
// ... Start the web server ...
gulp.watch(paths.scss, ['sandbox:css']);
// ... Watch more stuff ...
});
我也将转换用于我的最小化部署:
gulp.task('deploy:css', function () {
return gulp.src(paths.scss)
.pipe(scssTransform())
.pipe(concat(files.cssMin))
.pipe(cssmin())
.pipe(gulp.dest(dirs.deploy));
});