2015-10-19 51 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是空的(#)什麼也沒有返回。