通常我们可以通过gulp mytask之类的东西从控制台运行gulp任务。我是否可以将参数传递给gulp任务?如果可能,请举例说明如何做到这一点。


当前回答

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

从命令行到gulp文件(这里已经举例说明了)。 从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});

如果您有很多gulp任务,并且想要传递一些方便的环境配置,这可以派上用场。我不确定它是否能在一个任务和另一个任务之间工作。

其他回答

只需要在进程中将它加载到一个新对象中。的过程。Gulp ={}并让任务查看那里。

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

从命令行到gulp文件(这里已经举例说明了)。 从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});

如果您有很多gulp任务,并且想要传递一些方便的环境配置,这可以派上用场。我不确定它是否能在一个任务和另一个任务之间工作。

这是节目不可或缺的特色。你可以试试码。

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,让它以不同的方式运行任务?)

如果你想避免增加额外的依赖,我找到了node的进程。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”的任务。

有一个官方的极简主义的吞咽食谱。

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

基本方法是使用minimist分离cli参数,并将它们与已知选项结合起来:

var options = minimist(process.argv.slice(2), knownOptions);

解析什么呢

$ gulp scripts --env development

在食谱中有更完整的信息。