如何让Gulp.src在缺少文件时失败?

11

我们的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 来获取新组件,他们就会遇到问题。由于它不介意一个 glob 返回空值(即使它是命名文件),因此 scripts.js 将在没有这些组件的情况下构建。

这应该如何解决?是否有一种方法可以在 glob 返回零结果时抛出错误?

4个回答

14

因为似乎没有现成的解决方案,所以我编写了一个模块来满足我们的需求。

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'));
});

1
嗨,我缺少一些功能,比如单个字符串参数以及使用感叹号语法忽略文件的可能性。我已经向您发送了一份拉取请求。 - schlingel

0

路径:javascriptCopyNodeModules: # - "node_modules/name.min.js"

从 'is-there' 导入;

function javascriptCopyNodeModules() { 如果(IsThere(PATHS.javascriptCopyNodeModules)){ return gulp.src(PATHS.javascriptCopyNodeModules) .pipe(gulp.dest(PATHS.dist + '/assets/js/node_modules')); }else{ return gulp.src('path_of_file'); } }


semma thalapathy - sumavena

0

我使用了这个包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 为空 (#),因此不返回任何内容。


0

你可以使用gulp-plumber,一个gulp插件,在构建时获取错误。

以下是示例:

步骤1:安装gulp-plumber:

npm i --save-dev gulp-plumber 

步骤2:在gulpfile中导入gulp plmber模块:

...
var plumber = require('gulp-plumber'),
...   

步骤三:使用方法

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
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接