【问题标题】:gulp tasks sharing a common setting without a global objectgulp 任务共享一个没有全局对象的公共设置
【发布时间】:2016-02-27 09:28:47
【问题描述】:

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

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

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

/config/index.js

var config = {}

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

module.exports = config;

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

default.js

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

gulp.task('default', ['build'], function(cb) {
}); 

这是我想将 buildType 设置为 'dist' 的部署任务

部署.js

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

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

}); 

这是一个构建任务,我想根据 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);
});

这就是问题所在如果我在 default.js 中设置 config.buildType 或在 gulp.task 之外设置 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']); 

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

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

【问题讨论】:

    标签: javascript node.js gulp global


    【解决方案1】:

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

    你可以这样做:

    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);
    }
    });
    
    • gulp build NODE_ENV=production 用于生产
    • gulp build NODE_ENV=development

    这将与 Travis 等现有 CI 工具完美配合。

    【讨论】:

    • 这可能会有所帮助,但仍然存在同样的问题。如果我在任务函数之外为 process.env.buildType 设置一个值,它只是最后一个使用的设置,如果我在 gulp 任务函数中执行它,那么在调用 build 之前它不会设置。顺便说一句,我不仅要设置开发/生产开关,我只提供了一个简单的示例来说明我所追求的。
    • 我更新了我的问题,让我的问题更加清晰,并引用了一个问题和可能的解决方案。
    【解决方案2】:

    决定完全放弃“构建”任务。在 gulp 4.0 发布后,它有望以类似的形式工作。它允许我在调用其他任务之前修改任何设置。可以在像我的 'sass' 任务这样的任务中使用它和 gulpif ,这是一个仅限管道的任务。仍然想知道是否有“更好”的方法。

    var gulp = require('gulp');
    var config = require('../config/');
    var runSequence = require('run-sequence');
    
    gulp.task('default', function(cb) {
    config.buildType='dev'
    config.url = 'http://localhost:' + config.localport;
    runSequence('clean',['sass',config.htmlGenerator],'watch', cb);
    }); 
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多