【问题标题】:How to make Gulp.src fail if a file is missing?如果文件丢失,如何使 Gulp.src 失败?
【发布时间】:2016-01-17 11:38:05
【问题描述】:

我们的 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 返回零结果,有没有办法抛出错误?

【问题讨论】:

    标签: javascript gulp bower node-glob


    【解决方案1】:

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

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

    【讨论】:

    • 您好,我缺少一些功能,例如单个字符串参数以及使用感叹号语法忽略文件​​的可能性。我已向您发送拉取请求。
    【解决方案2】:

    我用过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 为空 (#) 不返回任何内容。

    【讨论】:

      【解决方案3】:

      PATHS: 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')); }别的{ 返回 gulp.src('path_of_file'); } }

      【讨论】:

      • semma thalapathy
      【解决方案4】:

      您可以使用gulp-plumber 一个 gulp 插件在构建时出错。

      举例说明:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2011-01-22
        相关资源
        最近更新 更多