是否有可能传递一个标志给Gulp,让它以不同的方式运行任务?

在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));
});
156992 次浏览

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

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-taskgulp my-js-task --production

编辑

gulp-util弃用,应该避免使用,所以建议使用minimist,而gulp-util已经使用了它。

所以我改变了gulpfile中的一些行来删除gulp-util:

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


gulp.task('styles', function() {
return gulp.src(['src/styles/' + (argv.theme || 'main') + '.scss'])
…
});

原始

在我的项目中,我使用以下标志:

gulp styles --theme literature

Gulp为此提供了一个对象gulp.env。它在新版本中已弃用,因此必须使用gulp-util。任务如下所示:

var util = require('gulp-util');


gulp.task('styles', function() {
return gulp.src(['src/styles/' + (util.env.theme ? util.env.theme : 'main') + '.scss'])
.pipe(compass({
config_file: './config.rb',
sass   : 'src/styles',
css    : 'dist/styles',
style  : 'expanded'


}))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'ff 17', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(livereload(server))
.pipe(gulp.dest('dist/styles'))
.pipe(notify({ message: 'Styles task complete' }));
});

环境设置在所有子任务期间可用。所以我也可以在监视任务上使用这个标志:

gulp watch --theme literature

我的样式任务也可以工作。

< p >再见 拉尔夫< / p >

这是我找到的一个快速食谱:

gulpfile.js

var gulp   = require('gulp');


// npm install gulp yargs gulp-if gulp-uglify
var args   = require('yargs').argv;
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');


var isProduction = args.env === 'production';


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

CLI

gulp scripts --env production

原始Ref(不再可用):https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-params-from-cli.md

另类与极简主义

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

gulpfile.js

// 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 if production
.pipe(gulp.dest('dist'));
});

CLI

gulp scripts --env production

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

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


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

执行它:gulp --env production

...然而,我认为这是tooo严格和不是防弹的!所以,我摆弄了一下…最后得到了这个效用函数:

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 isn't equal to bar."

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

好了,到此为止……下面是一个使用狼吞虎咽地吃的简单示例:

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 --env production

有一个非常简单的方法可以在不解析参数的情况下实现on/off标志。gulpfile.js只是一个像其他文件一样执行的文件,所以你可以这样做:

var flags = {
production: false
};


gulp.task('production', function () {
flags.production = true;
});

并使用类似gulp-if的东西有条件地执行一个步骤

gulp.task('build', function () {
gulp.src('*.html')
.pipe(gulp_if(flags.production, minify_html()))
.pipe(gulp.dest('build/'));
});

执行gulp build将生成一个漂亮的html,而gulp production build将缩小它。

我构建了一个插件,从命令行注入参数到任务回调。

gulp.task('mytask', function (production) {
console.log(production); // => true
});


// gulp mytask --production

https://github.com/stoeffel/gulp-param < a href = " https://github.com/stoeffel/gulp-param " > < / >

如果有人发现了一个bug或对其进行了改进,我很乐意合并pr。

从命令行传递参数

// 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

Source .

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

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

我们想为不同的环境传递不同的配置文件——生产dev测试。下面是gulp文件中的代码:

//passing in flag to gulp to set environment
//var env = gutil.env.env;


if (typeof gutil.env.env === 'string') {
process.env.NODE_ENV = gutil.env.env;
}

这是app.js文件中的代码:

  if(env === 'testing'){
var Config = require('./config.testing.js');
var Api = require('./api/testing.js')(Config.web);
}
else if(env === 'dev'){
Config = require('./config.dev.js');
Api = require('./api/dev.js').Api;
}
else{
Config = require('./config.production.js');
Api = require('./api/production.js')(Config.web);
}

然后运行gulp --env=testing

如果你使用的是typescript (gulpfile.ts),那么对yargs这样做(基于@Caio Cunha的出色回答https://stackoverflow.com/a/23038290/1019307和上面的其他评论):

安装

npm install --save-dev yargs


typings install dt~yargs --global --save

.ts文件

把这个添加到.ts文件中:

import { argv } from 'yargs';


...


let debug: boolean = argv.debug;

这必须在每个.ts文件中单独完成(甚至是导入到gulpfile.ts/js中的tools/tasks/project文件)。

运行

gulp build.dev --debug

或者在npm下将参数传递给gulp:

npm run build.dev -- --debug

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

我正在使用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