通常我们可以通过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任务,并且想要传递一些方便的环境配置,这可以派上用场。我不确定它是否能在一个任务和另一个任务之间工作。

其他回答

下面是我如何使用它的示例。对于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);
});

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

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

如果你用gulp搭配yargs,注意以下几点:

如果你有一个任务'客户',不想使用yargs内置参数检查所需的命令:

.command("customer <place> [language]","创建客户目录") 调用它:

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

Yargs总是会抛出一个错误,表示没有足够的命令被分配给调用,即使你有!!- - - - - -

试一下,在命令中只添加一个数字(使其不等于gulp-task名称)…它会起作用:

.command("customer1 <place> [language]","创建客户目录")

这是因为gulp似乎触发了任务,在yargs能够检查此所需参数之前。我花了好几个小时才弄明白。

希望这对你有所帮助。

我知道我回答这个问题有点晚了,但我想为@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功能,并可以使命令行传递体验更好。

.alias(键,别名) 将键名设置为等效的,以便对键的更新将传播 到别名,反之亦然。 可选地,.alias()可以接受一个将键映射到别名的对象。每一个 该对象的Key应该是该选项的规范版本,并且 每个值应该是一个字符串或字符串数组。

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

要从命令行传递参数,可以这样做:

发展: 吞咽dev

生产: NODE_ENV=production gulp dev

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

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

MYAPP=something_else gulp开发

process.env.MYAPP === 'something_else'

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