通常我们可以通过类似的命令从控制台运行gulp任务gulp mytask
。无论如何,我可以将参数传递给gulp任务吗?如果可能,请显示示例如何完成。
通常我们可以通过类似的命令从控制台运行gulp任务gulp mytask
。无论如何,我可以将参数传递给gulp任务吗?如果可能,请显示示例如何完成。
Answers:
这是程序不能没有的功能。您可以尝试yargs。
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以使其以不同的方式运行任务?)
(argv.production === undefined) ? false : true;
等同于 argv.production !== undefined
。
如果您想避免添加额外的依赖项,我发现节点process.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”的任务。
gulp myTask --production
结果process.argv
等于[pathToNode, pathToGulp, 'myTask', '--production']
将参数传递给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});
如果您有大量的任务,并想通过一些方便的环境配置,这会派上用场。我不确定它是否可以在一项任务和另一项任务之间工作。
有一个使用极简主义者的官方口水配方。
https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md
基础知识使用极简主义者来分隔cli参数,并将其与已知选项结合起来:
var options = minimist(process.argv.slice(2), knownOptions);
哪个会解析类似
$ gulp scripts --env development
食谱中更完整的信息。
@Ethan的答案将完全起作用。根据我的经验,更多的节点方式是使用环境变量。这是配置部署在托管平台(例如Heroku或Dokku)上的程序的标准方法。
要从命令行传递参数,请执行以下操作:
发展:
gulp dev
生产:
NODE_ENV=production gulp dev
语法不同,但是非常Unix,并且与Heroku,Dokku等兼容。
您可以在以下代码中访问变量 process.env.NODE_ENV
MYAPP=something_else gulp dev
将设置
process.env.MYAPP === 'something_else'
这个答案可能会给您其他一些想法。
这是我如何使用它的示例。对于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);
});
如果您将gulp与yargs一起使用,注意以下几点:
如果您有任务“客户”并且不想在参数检查中使用yargs构建所需命令:
.command("customer <place> [language]","Create a customer directory")
用:
gulp customer --customer Bob --place Chicago --language english
yargs始终会引发错误,即使您有没有足够的命令分配给该调用!-
尝试一下,仅在命令中添加一个数字(以使其不等于gulp-task名称)...它将起作用:
.command("customer1 <place> [language]","Create a customer directory")
这是因为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
。我们还yargs
可以在那里找到更多功能,并使命令行传递体验更好。
.alias(密钥,别名)
将密钥名称设置为等效,这样对密钥的更新将传播到别名,反之亦然。
可选的.alias()可以采用将键映射到别名的对象。该对象的每个键应为该选项的规范版本,并且每个值均应为字符串或字符串数组。