将参数传递给Gulp任务

use*_*781 181 gulp

通常我们可以通过类似的东西从控制台运行gulp任务gulp mytask.反正我是否可以将参数传递给gulp任务?如果可能,请举例说明如何完成.

Eth*_*han 254

这是一个功能计划不能没有.你可以试试yargs.

npm install --save-dev yargs
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

gulp mytask --production --test 1234
Run Code Online (Sandbox Code Playgroud)

在代码中,例如:

var argv = require('yargs').argv;
var isProduction = (argv.production === undefined) ? false : true;
Run Code Online (Sandbox Code Playgroud)

您的理解:

> 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
Run Code Online (Sandbox Code Playgroud)

希望你能从这里拿走它.

你可以使用另一个插件,最小化.还有另一个帖子,其中有yargs和minimist的好例子:( 是否有可能将标志传递给Gulp让它以不同的方式运行任务?)

  • 写得非常好,谢谢你的例子! (11认同)
  • `(argv.production === undefined)?false:true;`相当于`argv.production!== undefined`. (5认同)

Tre*_*hek 131

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

gulp.task('mytask', function() {
    console.log(process.argv);
});
Run Code Online (Sandbox Code Playgroud)

所以以下内容:

gulp mytask --option 123
Run Code Online (Sandbox Code Playgroud)

应该显示:

[ 'node', 'path/to/gulp.js', 'mytask', '--option', '123']
Run Code Online (Sandbox Code Playgroud)

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

var option = process.argv[4]; //set to '123'
Run Code Online (Sandbox Code Playgroud)

但是:由于选项可能没有设置,或者可能处于不同的位置,我觉得更好的想法是这样的:

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

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

//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
Run Code Online (Sandbox Code Playgroud)

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

  • 它可能已经改变了,我已经看到了一些具有相同差异的旧例子.无论如何,你可以调试它,看看你的情况.这应该是公认的答案,因为它具有零依赖性. (2认同)

yuv*_*lio 19

将参数传递给gulp可能意味着一些事情:

  • 从命令行到gulpfile(已在此处举例说明).
  • 从gulpfile.js脚本的主体到gulp任务.
  • 从一个gulp任务到另一个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 );
  });

};
Run Code Online (Sandbox Code Playgroud)
//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});
Run Code Online (Sandbox Code Playgroud)

如果您有很多gulp任务并希望通过它们一些方便的环境配置,这可以派上用场.我不确定它是否可以在一个任务和另一个任务之间工作.


Rob*_*obW 14

有一个官方的吞食配方使用最小化.

https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md

基础知识是使用最小化来分离cli参数并将它们与已知选项结合起来:

var options = minimist(process.argv.slice(2), knownOptions);
Run Code Online (Sandbox Code Playgroud)

哪个会解析类似的东西

$ gulp scripts --env development
Run Code Online (Sandbox Code Playgroud)

食谱中有更完整的信息.


Quy*_*ang 14

如果你想使用环境参数和其他工具,例如log,你可以使用gulp-util

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


Mic*_*ole 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'

这个答案可能会给你一些其他想法.