2015-10-19 54 views
7

我们的gulp构建需要一系列与bower一起安装的库,然后将它们与我们分布在多个目录中的所有代码连接起来。这里是什么样子:如何让Gulp.src失败,如果文件丢失?

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在没有它们的情况下生成,因为它不会介意其中一个globs返回空,即使它是一个命名文件。

这应该如何解决?如果glob返回零结果,是否有办法引发错误?

回答

7

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

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

我已经使用这个包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是空的(#)什么也没有返回。