在Gulp中,任务通常是这样的:

gulp.task('my-task', function() {
    return gulp.src(options.SCSS_SOURCE)
        .pipe(sass({style:'nested'}))
        .pipe(autoprefixer('last 10 version'))
        .pipe(concat('style.css'))
        .pipe(gulp.dest(options.SCSS_DEST));
});

是否有可能将命令行标志传递给gulp(这不是一个任务),并让它在此基础上有条件地运行任务?例如

$ gulp my-task -a 1

然后在gulpfile.js中:

gulp.task('my-task', function() {
        if (a == 1) {
            var source = options.SCSS_SOURCE;
        } else {
            var source = options.OTHER_SOURCE;
        }
        return gulp.src(source)
            .pipe(sass({style:'nested'}))
            .pipe(autoprefixer('last 10 version'))
            .pipe(concat('style.css'))
            .pipe(gulp.dest(options.SCSS_DEST));
});

当前回答

var isProduction = (process.argv.indexOf("production")>-1);

CLI gulp production调用我的生产任务,并为任何条件设置一个标志。

其他回答

如果你有一些严格的(ordered!)参数,那么你可以通过检查process.argv来获得它们。

var args = process.argv.slice(2);

if (args[0] === "--env" && args[1] === "production");

执行它:gulp—env production

...然而,我认为这太严格了,不是无懈可击的!所以,我摆弄了一下…最后得到了这个效用函数:

function getArg(key) {
  var index = process.argv.indexOf(key);
  var next = process.argv[index + 1];
  return (index < 0) ? null : (!next || next[0] === "-") ? true : next;
}

它吃掉一个参数-name,并在process.argv中搜索这个参数。如果什么都没有找到,它吐出null。否则,如果their没有下一个参数,或者下一个参数是命令而不是值(我们用破折号不同),则返回true。(这是因为键存在,但没有值)。如果之前的所有情况都失败,那么下一个参数-value就是我们得到的。

> gulp watch——foo——bar 1337 -boom“foo不等于bar。”

getArg("--foo") // => true
getArg("--bar") // => "1337"
getArg("-boom") // => "Foo isn't equal to bar."
getArg("--404") // => null

好了,到此为止……下面是一个使用gulp的简单例子:

var gulp = require("gulp");
var sass = require("gulp-sass");
var rename = require("gulp-rename");

var env = getArg("--env");

gulp.task("styles", function () {
  return gulp.src("./index.scss")
  .pipe(sass({
    style: env === "production" ? "compressed" : "nested"
  }))
  .pipe(rename({
    extname: env === "production" ? ".min.css" : ".css"
  }))
  .pipe(gulp.dest("./build"));
});

运行gulp——环境生产

从命令行传递参数

// npm install --save-dev gulp gulp-if gulp-uglify minimist

var gulp = require('gulp');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');

var minimist = require('minimist');

var knownOptions = {
  string: 'env',
  default: { env: process.env.NODE_ENV || 'production' }
};

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

gulp.task('scripts', function() {
  return gulp.src('**/*.js')
    .pipe(gulpif(options.env === 'production', uglify())) // only minify in production
    .pipe(gulp.dest('dist'));
});

然后大口地跑:

$ gulp scripts --env development

Gulp没有为此提供任何类型的util,但您可以使用众多命令参数解析器中的一个。我喜欢码。应该是:

var argv = require('yargs').argv;

gulp.task('my-task', function() {
    return gulp.src(argv.a == 1 ? options.SCSS_SOURCE : options.OTHER_SOURCE)
        .pipe(sass({style:'nested'}))
        .pipe(autoprefixer('last 10 version'))
        .pipe(concat('style.css'))
        .pipe(gulp.dest(options.SCSS_DEST));
});

你也可以将它与gulp-if结合起来,有条件地管道流,对于开发vs. prod构建非常有用:

var argv = require('yargs').argv,
    gulpif = require('gulp-if'),
    rename = require('gulp-rename'),
    uglify = require('gulp-uglify');

gulp.task('my-js-task', function() {
  gulp.src('src/**/*.js')
    .pipe(concat('out.js'))
    .pipe(gulpif(argv.production, uglify()))
    .pipe(gulpif(argv.production, rename({suffix: '.min'})))
    .pipe(gulp.dest('dist/'));
});

然后调用gulp my-js-task或者gulp my-js-task——production。

var isProduction = (process.argv.indexOf("production")>-1);

CLI gulp production调用我的生产任务,并为任何条件设置一个标志。

这个问题发布已经有一段时间了,但也许它会帮助到一些人。

我正在使用GULP CLI 2.0.1(全局安装)和GULP 4.0.0(本地安装),这里是如何在没有任何额外插件的情况下做到这一点。我认为代码是不言自明的。

var cp = require('child_process'), 
{ src, dest, series, parallel, watch } = require('gulp');

// == availableTasks: log available tasks to console
function availableTasks(done) {
  var command = 'gulp --tasks-simple';
  if (process.argv.indexOf('--verbose') > -1) {
    command = 'gulp --tasks';
  }
  cp.exec(command, function(err, stdout, stderr) {
    done(console.log('Available tasks are:\n' + stdout));
  });
}
availableTasks.displayName = 'tasks';
availableTasks.description = 'Log available tasks to console as plain text list.';
availableTasks.flags = {
  '--verbose': 'Display tasks dependency tree instead of plain text list.'
};
exports.availableTasks = availableTasks;

从控制台运行:

gulp availableTasks

然后运行并查看差异:

gulp availableTasks --verbose