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


当前回答

如果您想使用环境参数和其他util(如log),则可以使用gulp-util

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

更新

Gulp-util现在已弃用。你可以用极简主义来代替。

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

其他回答

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

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

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

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

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

@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'

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

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

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

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

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

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

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

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

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

希望这对你有所帮助。