将parameter passing给Gulp任务
通常我们可以从控制台通过gulp mytask
类的东西运行gulp mytask
。 无论如何,我可以通过parameter passing给任务吗? 如果可能,请举例说明如何完成。
这是一个function程序不能没有。 你可以尝试一下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
希望你能从这里拿走。
还有另一个可以使用的插件,minimist。 还有另外一个post,里面有很多yargs和minimist的例子:( 是否可以通过一个标志来让Gulp以不同的方式运行任务? )
如果你想避免添加额外的依赖,我发现节点的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
** 编辑:对于节点脚本是正确的,但是吞吐解释任何没有领先的“ – ”作为另一个任务名称。 所以使用gulp mytask 123
会失败,因为gulp mytask 123
无法find一个名为'123'的任务。
如果你想使用环境params和其他utils以及如日志,你可以使用gulp-util
/* $npm install gulp-util --save-dev $gulp --varName 123 */ var util = require('gulp-util'); util.log(util.env.varName);
传递一个参数可能意味着一些事情:
- 从命令行到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});
这可以派上用场,如果你有很多吞咽任务,并希望通过他们一些方便的环境configuration。 我不确定它是否可以在一个任务和另一个任务之间工作。
这个使用最小化的方法有一个官方的吞食方法 。
https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md
基础是使用最小化来分离cli参数,并将它们与已知的选项结合起来:
var options = minimist(process.argv.slice(2), knownOptions);
这将parsing的东西
$ gulp scripts --env development
配方中更完整的信息。
Ethan的回答完全可以奏效。 根据我的经验,更多的节点方式是使用环境variables。 这是configuration托pipe平台上部署的程序(例如Heroku或Dokku)的标准方式。
要从命令行传递参数,请执行以下操作:
开发: gulp dev
生产: NODE_ENV=production gulp dev
语法是不同的,但是非常的Unix,并且与Heroku,Dokku等等兼容
您可以在process.env.NODE_ENV
访问代码中的variables
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); });
这是没有额外模块的另一种方式:
我需要从任务名称中猜测环境,我有一个'dev'任务和一个'prod'任务。
当我运行gulp prod
它应该被设置为prod环境。 当我运行gulp dev
或其他任何东西时,应该设置为开发环境。
为此,我只是检查正在运行的任务名称:
devEnv = process.argv[process.argv.length-1] !== 'prod';
如果你用y use吞食,注意下列事项:
如果你有一个任务“客户”,并且不想使用yargs参数检查所需的命令:
.command("customer <place> [language]","Create a customer directory")
用以下方式调用它:
gulp customer --customer Bob --place Chicago --language english
yargs会抛出一个错误,即使没有足够的命令被分配给该电话,即使你有! –
尝试一下,只给命令添加一个数字(使其不等于吞噬任务名称)…它将工作:
.command("customer1 <place> [language]","Create a customer directory")
这是吞噬的原因似乎触发任务,之前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
文档中给出的别名的使用。 我们还可以在那里find更多的yargs
函数,并且可以使命令行的传递经验更好。
.alias(键,别名)
将密钥名称设置为等效,以便对密钥的更新将传播到别名,反之亦然。
可选.alias()可以将一个将键映射到别名的对象。 这个对象的每个键都应该是该选项的规范版本,每个值应该是一个string或一个string数组。
只需将其加载到进程中的新对象上process.gulp = {}
并让任务看起来在那里。