如果文件丢失,如何使 Gulp.src 失败?
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 returns 是空的,即使它是一个命名文件。
这个应该怎么解决?如果 glob returns 零结果,有没有办法抛出错误?
由于似乎没有现成的解决方案,我写了一个模块来满足我们的需要。
files-exist 模块允许您检查数组中的所有文件是否都存在,如果有缺失则抛出错误。它 returns 成功时是一个相同的数组,因此很容易就位。
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 是空的 (#) return 没有。
路径: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')); }别的{
return gulp.src('path_of_file'); } }
您可以使用 gulp-plumber
一个 gulp 插件来在构建时出错。
举例说明:
步骤 1: 安装 gulp-plumber:
npm i --save-dev gulp-plumber
步骤 2: 需要 gulp 文件中的 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
});
我们的 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 returns 是空的,即使它是一个命名文件。
这个应该怎么解决?如果 glob returns 零结果,有没有办法抛出错误?
由于似乎没有现成的解决方案,我写了一个模块来满足我们的需要。
files-exist 模块允许您检查数组中的所有文件是否都存在,如果有缺失则抛出错误。它 returns 成功时是一个相同的数组,因此很容易就位。
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 是空的 (#) return 没有。
路径: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')); }别的{ return gulp.src('path_of_file'); } }
您可以使用 gulp-plumber
一个 gulp 插件来在构建时出错。
举例说明:
步骤 1: 安装 gulp-plumber:
npm i --save-dev gulp-plumber
步骤 2: 需要 gulp 文件中的 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
});