gulp 任务共享公共设置而无需全局对象

DKe*_*ler 5 javascript global node.js gulp

我有许多 gulp 任务,每个任务都驻留在自己的文件中(使用 require-dir 模块)而不是单个文件。

我使用模块进行配置设置,而不是 json 文件(我更喜欢用它来进行注释和派生值)。

为了简单起见,这里有一个示例设置,我需要在 gulp 任务之间共享/设置一个键。

/config/index.js

var config = {}

config.buildType  = '';  // set this to either 'dev' or 'dist'

module.exports = config;
Run Code Online (Sandbox Code Playgroud)

这是我想将 config.buildType 设置为“dev”的默认任务

默认.js

var gulp = require('gulp');
var config = require('../config/');

gulp.task('default', ['build'], function(cb) {
}); 
Run Code Online (Sandbox Code Playgroud)

这是一个部署任务,我想将其 buildType 设置为“dist”

部署.js

var gulp         = require('gulp');
var config = require('../config/');

gulp.task('deploy-s3', ['build'], function() {

}); 
Run Code Online (Sandbox Code Playgroud)

这是我想根据 buildType 更改的构建任务

构建.js

var gulp         = require('gulp');
var runSequence = require('run-sequence');
var config = require('../config/');

gulp.task('build', function(cb) {

console.log('in build',config.buildType);
if (config.buildType == 'dev') runSequence('clean',['sass',config.htmlGenerator], 'watch', cb);
if (config.buildType == 'dist') runSequence('clean',['sass',config.htmlGenerator], cb);
});
Run Code Online (Sandbox Code Playgroud)

所以这就是问题 如果我config.buildType在 gulp.task 之外设置 default.js 或deploy.js,那么由于它们都通过 require-dir 基本上集中到一个文件中,因此该值只是最后加载的文件。如果我将其设置在 gulp.task 函数内,我会对该设置的时间/范围感到困惑。

更新:发现此相关问题https://github.com/gulpjs/gulp/issues/193。在本期中指出,任务函数在所有排队任务之后启动,这意味着我无法在任务函数内设置某些内容并期望它在列出的任务之前执行(在我的例子中为“构建”)

一位发帖人做了一个设置这样的参数的任务

gulp.task('set-dist', function () {
  config.buildType = 'dist';
});

gulp.task('deploy', ['set-dist', 'build']); 
Run Code Online (Sandbox Code Playgroud)

所以一些建议......我应该走这种“黑客”的道路还是有更好的方法来做到这一点?

(仅供参考,我自己学习node/javascript才几个月,所以我的经验有限)

Ala*_*uza 0

您可以用来process.env保存项目的配置属性。检查这个

对于你的情况你可以这样做:

var gulp         = require('gulp');
var runSequence = require('run-sequence');

gulp.task('build', function(cb) {
if (process.env.NODE_ENV === 'development') {
  runSequence('clean',['sass',config.htmlGenerator], 'watch', cb);
} else {
  runSequence('clean',['sass',config.htmlGenerator], cb);
}
});
Run Code Online (Sandbox Code Playgroud)
  • gulp build NODE_ENV=production用于生产
  • 或者gulp build NODE_ENV=development

这将与 Travis 等现有的 CI 工具很好地配合。