[英]How to make Gulp.src fail if a file is missing?
我們的 gulp 構建需要一堆用 bower 安裝的庫,然后將它們與我們分布在多個目錄中的所有代碼連接起來。 這是它的樣子:
var jsFiles = [
sourcePath + '/config/config.js',
sourcePath + '/vendor/jquery/dist/jquery.js',
sourcePath + '/vendor/js-cookie/src/js.cookie.js',
sourcePath + '/vendor/modernizr/modernizr.js',
sourcePath + '/vendor/lodash/lodash.js',
sourcePath + '/vendor/picturefill/dist/picturefill.min.js',
sourcePath + '/templates/**/*.js',
sourcePath + '/pages/**/*.js'
],
gulp.task('build:js', ['jscs'], function() {
return gulp.src(jsFiles)
.pipe(concat('scripts.js'))
.pipe(gulpif(isProd, uglify()))
.pipe(gulp.dest(outputPath + '/webresources/js'));
});
我們的問題是,每當有人添加新庫時,其他開發人員如果沒有運行bower install
來獲取新組件,就會遇到問題。 scripts.js
在沒有它們的情況下構建,因為它不會介意其中一個 glob 返回空,即使它是一個命名文件。
這應該如何解決? 如果 glob 返回零結果,有沒有辦法拋出錯誤?
由於似乎沒有現成的解決方案,因此我編寫了一個模塊來滿足我們的需求。
files-exist模塊允許您檢查數組中的所有文件是否都存在,如果缺少則拋出錯誤。 它在成功時返回一個相同的數組,因此很容易放置到位。
var jsFiles = [
sourcePath + '/config/config.js',
sourcePath + '/vendor/jquery/dist/jquery.js',
sourcePath + '/vendor/js-cookie/src/js.cookie.js',
sourcePath + '/vendor/modernizr/modernizr.js',
sourcePath + '/vendor/lodash/lodash.js',
sourcePath + '/vendor/picturefill/dist/picturefill.min.js',
sourcePath + '/templates/**/*.js',
sourcePath + '/pages/**/*.js'
],
filesExist = require('files-exist'),
gulp.task('build:js', ['jscs'], function() {
return gulp.src(filesExist(jsFiles)) // Throws error if a file is missing
.pipe(concat('scripts.js'))
.pipe(gulpif(isProd, uglify()))
.pipe(gulp.dest(outputPath + '/webresources/js'));
});
我用過這個包 IsThere
https://www.npmjs.com/package/is-there
前任。
PATHS:
javascriptCopyNodeModules:
# - "node_modules/name.min.js"
import IsThere from 'is-there';
function javascriptCopyNodeModules() {
if(IsThere(PATHS.javascriptCopyNodeModules)){
return gulp.src(PATHS.javascriptCopyNodeModules)
.pipe(gulp.dest(PATHS.dist + '/assets/js/node_modules'));
}else{
return gulp.src('.');
}
}
因為 PATHS.javascriptCopyNodeModules 是空的 (#) 不返回任何內容。
路徑:javascriptCopyNodeModules:#-“node_modules/name.min.js”
從'is-there'導入IsThere;
function javascriptCopyNodeModules() { if(IsThere(PATHS.javascriptCopyNodeModules)){ return gulp.src(PATHS.javascriptCopyNodeModules) .pipe(gulp.dest(PATHS.dist + '/assets/js/node_modules')); }else{ return gulp.src('path_of_file'); } }
您可以使用gulp-plumber
插件來在構建時出錯。
舉例說明:
第 1 步:安裝 gulp-plumber:
npm i --save-dev gulp-plumber
第 2 步:在 gulpfile 中需要 gulp plmber 模塊:
...
var plumber = require('gulp-plumber'),
...
第 3 步:使用
gulp.task('concatFiles', function (done) {
gulp.src(['../a.js', '../b.js', '../c.js'])
.pipe(plumber())
.pipe(concat('destination.js'))
.pipe(plumber.stop())
.pipe(gulp.dest('dist/js'));
done(); // a callback required in gulp 4
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.