将参数传递给Gulp任务


Answers:


269

这是程序不能没有的功能。您可以尝试yargs

npm install --save-dev yargs

您可以像这样使用它:

gulp mytask --production --test 1234

在代码中,例如:

var argv = require('yargs').argv;
var isProduction = (argv.production === undefined) ? false : true;

您的理解:

> gulp watch
console.log(argv.production === undefined);  <-- true
console.log(argv.test === undefined);        <-- true

> gulp watch --production
console.log(argv.production === undefined);  <-- false
console.log(argv.production);                <-- true
console.log(argv.test === undefined);        <-- true
console.log(argv.test);                      <-- undefined

> gulp watch --production --test 1234
console.log(argv.production === undefined);  <-- false
console.log(argv.production);                <-- true
console.log(argv.test === undefined);        <-- false
console.log(argv.test);                      <-- 1234

希望你可以从这里拿走。

还有一个可以使用的插件,最小化。在另一篇文章中,有关于yargs和minimist的好例子:(是否可以将标志传递给Gulp以使其以不同的方式运行任务?


13
答案写得很好,感谢您的示例!
艾伦·赖斯

如何在javascript中访问此内容?
维尼

如果将gulp与yargs一起使用,请注意以下几点:如果您有任务'customer',并且不想使用yargs build in参数检查所需命令:command(“ customer”,“ Create a customer directory”)
suther

如果您想使用内置参数的yargs来检查所需的“命令”和gulp,请参阅下面的评论:stackoverflow.com/a/41412558/1256697
Suther

5
(argv.production === undefined) ? false : true;等同于 argv.production !== undefined
CJStuart '17

136

如果您想避免添加额外的依赖项,我发现节点process.argv很有用:

gulp.task('mytask', function() {
    console.log(process.argv);
});

因此,以下内容:

gulp mytask --option 123

应该显示:

[ 'node', 'path/to/gulp.js', 'mytask', '--option', '123']

如果您确定所需的参数位于正确的位置,则不需要标记。**仅使用(在这种情况下):

var option = process.argv[4]; //set to '123'

但是:由于可能未设置该选项,或者可能处于其他位置,所以我认为更好的主意如下:

var option, i = process.argv.indexOf("--option");
if(i>-1) {
    option = process.argv[i+1];
}

这样,您可以处理多个选项的变化,例如:

//task should still find 'option' variable in all cases
gulp mytask --newoption somestuff --option 123
gulp mytask --option 123 --newoption somestuff
gulp mytask --flag --option 123

** 编辑:对于节点脚本为true,但是gulp会将没有前导“-”的任何内容解释为另一个任务名称。因此使用gulp mytask 123将失败,因为gulp无法找到名为“ 123”的任务。


1
“ var选项,i = process,argv.indexOf(“-option”);“中有一个错字。我相信应该是proccess.argv。
Luis Paulo Lohmann

嗯,应该这样。已更正。感谢@luis
Trevedhek 2015年

我只想检查--dev标志,以便区分生产环境和较低环境。这可以解决问题,而无需添加额外的依赖项。谢谢!
2015年

1
对我来说,gulp myTask --production结果process.argv等于[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho

2
它可能已经改变,我已经看到了一些具有相同差异的旧示例。无论如何,您可以调试它并查看您的情况。这应该是被接受的答案,因为它具有零依赖性
Juan

19

将参数传递给gulp可能意味着几件事:

  • 从命令行到gulpfile(此处已示例)。
  • 从gulpfile.js脚本主体到gulp任务。
  • 从一个吞咽任务到另一个吞咽任务。

这是一种将参数从主gulpfile传递到gulp任务的方法。通过将需要参数的任务移至其自己的模块并将其包装在函数中(以便可以传递参数):

// ./gulp-tasks/my-neat-task.js file
module.exports = function(opts){

  opts.gulp.task('my-neat-task', function(){
      console.log( 'the value is ' + opts.value );
  });

};
//main gulpfile.js file

//...do some work to figure out a value called val...
var val = 'some value';

//pass that value as a parameter to the 'my-neat-task' gulp task
require('./gulp-tasks/my-neat-task.js')({ gulp: gulp, value: val});

如果您有大量的任务,并想通过一些方便的环境配置,这会派上用场。我不确定它是否可以在一项任务和另一项任务之间工作。



14

如果要使用环境参数和其他实用程序(例如日志),则可以使用gulp-util

/* 
  $npm install gulp-util --save-dev
  $gulp --varName 123
*/
var util = require('gulp-util');
util.log(util.env.varName);

更新资料

gulp-util现在已弃用。您可以改用Minimist

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

1
gulp

5

@Ethan的答案将完全起作用。根据我的经验,更多的节点方式是使用环境变量。这是配置部署在托管平台(例如Heroku或Dokku)上的程序的标准方法。

要从命令行传递参数,请执行以下操作:

发展: gulp dev

生产: NODE_ENV=production gulp dev

语法不同,但是非常Unix,并且与Heroku,Dokku等兼容。

您可以在以下代码中访问变量 process.env.NODE_ENV

MYAPP=something_else gulp dev

将设置

process.env.MYAPP === 'something_else'

这个答案可能会给您其他一些想法。


4

这是我如何使用它的示例。对于css / less任务。可以全部申请。

var cssTask = function (options) {
  var minifyCSS = require('gulp-minify-css'),
    less = require('gulp-less'),
    src = cssDependencies;

  src.push(codePath + '**/*.less');

  var run = function () {
    var start = Date.now();

    console.log('Start building CSS/LESS bundle');

    gulp.src(src)
      .pipe(gulpif(options.devBuild, plumber({
        errorHandler: onError
      })))
      .pipe(concat('main.css'))
      .pipe(less())
      .pipe(gulpif(options.minify, minifyCSS()))
      .pipe(gulp.dest(buildPath + 'css'))
      .pipe(gulpif(options.devBuild, browserSync.reload({stream:true})))
      .pipe(notify(function () {
        console.log('END CSS/LESS built in ' + (Date.now() - start) + 'ms');
      }));
  };

  run();

  if (options.watch) {
    gulp.watch(src, run);
  }
};

gulp.task('dev', function () {
  var options = {
    devBuild: true,
    minify: false,
    watch: false
  };

  cssTask (options);
});

3

这是没有额外模块的另一种方法:

我需要从任务名称猜测环境,我有一个“开发”任务和一个“生产”任务。

运行时gulp prod,应将其设置为生产环境。当我跑步gulp dev或其他操作时,应将其设置为开发环境。

为此,我只需检查正在运行的任务名称:

devEnv = process.argv[process.argv.length-1] !== 'prod';

2

如果您将gulp与yargs一起使用,注意以下几点:

如果您有任务“客户”并且不想在参数检查中使用yargs构建所需命令:

.command("customer <place> [language]","Create a customer directory") 用:

gulp customer --customer Bob --place Chicago --language english

yargs始终会引发错误,即使您有没有足够的命令分配给该调用!-

尝试一下,仅在命令中添加一个数字(以使其不等于gulp-task名称)...它将起作用:

.command("customer1 <place> [language]","Create a customer directory")

这是因为gulp似乎在yargs能够检查此必需参数之前触发了任务。我花了几个小时来解决这个问题。

希望这对您有帮助。


0

我知道我回答这个问题太迟了,但是我想补充一些@Ethan的答案,这是投票率最高且被接受的答案。

我们可以yargs用来获取命令行参数,并以此为某些参数添加自己的别名,例如follow。

var args = require('yargs')
    .alias('r', 'release')
    .alias('d', 'develop')
    .default('release', false)
    .argv;

请参考此链接以获取更多详细信息。 https://github.com/yargs/yargs/blob/HEAD/docs/api.md

以下是根据的文档中给定的别名的使用yargs。我们还yargs可以在那里找到更多功能,并使命令行传递体验更好。

.alias(密钥,别名)

将密钥名称设置为等效,这样对密钥的更新将传播到别名,反之亦然。

可选的.alias()可以采用将键映射到别名的对象。该对象的每个键应为该选项的规范版本,并且每个值均应为字符串或字符串数​​组。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.