Обычно мы можем запускать задачу gulp с консоли с помощью gulp mytask
. В любом случае, я могу передать параметр в задачу gulp? Если возможно, пожалуйста, покажите пример, как это можно сделать.
Задайте параметр Gulp Задача
Ответ 1
Это программы функций не могут оставаться без. Вы можете попробовать 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. Там есть еще одна публикация, где есть хорошие примеры для yargs и minimist: (Можно ли передать флаг в Gulp для запуска задач по-разному?)
Ответ 2
Если вы хотите избежать добавления дополнительных зависимостей, я нашел node 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 для node скриптов, но gulp интерпретирует что-либо без ведущего "-" в качестве другого имени задачи. Поэтому использование gulp mytask 123
завершится неудачно, потому что gulp не может найти задачу под названием "123".
Ответ 3
Если вы хотите использовать параметры среды и другие утилиты, такие как журнал, вы можете использовать gulp-util
/*
$npm install gulp-util --save-dev
$gulp --varName 123
*/
var util = require('gulp-util');
util.log(util.env.varName);
Ответ 4
Передача параметра gulp может означать несколько вещей:
- Из командной строки в gulpfile (уже приведенный здесь пример).
- Из основного тела задач gulpfile.js script в gulp.
- От одной задачи gulp к другой задаче 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});
Это может пригодиться, если у вас есть много задач gulp и вы хотите передать им некоторые удобные экологические конфигурации. Я не уверен, может ли он работать между одной задачей и другой.
Ответ 5
Вот официальный рецепт gulp для этого, используя minimist.
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
Более подробная информация в рецепте.
Ответ 6
@Этот ответ будет полностью работать. По моему опыту, более node способ заключается в использовании переменных среды. Это стандартный способ настройки программ, развернутых на платформах хостинга (например, 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'
Этот ответ может дать вам некоторые другие идеи.
Ответ 7
Вот мой пример, как я его использую. Для задачи 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);
});
Ответ 8
Вот еще один способ без дополнительных модулей:
Мне нужно было угадать среду из имени задачи, у меня есть задача "dev" и "prod".
Когда я запускаю gulp prod
, он должен быть установлен в среду prod.
Когда я запускаю gulp dev
или что-то еще, он должен быть установлен в среду dev.
Для этого я просто проверяю имя запущенной задачи:
devEnv = process.argv[process.argv.length-1] !== 'prod';
Ответ 9
Если вы используете gulp с yargs, обратите внимание на следующее:
Если у вас есть задача "клиент" и wan't использовать yargs build в проверке параметров для требуемых команд:
.command("customer <place> [language]","Create a customer directory")
вызовите его с помощью:
gulp customer --customer Bob --place Chicago --language english
yargs все равно выведут ошибку, что для вызова не было назначено команд, даже если у вас есть!! -
Попробуйте и добавьте в команду только цифру (чтобы сделать ее не равной gulp -task name)... и она будет работать:
.command("customer1 <place> [language]","Create a customer directory")
Это причина gulp, похоже, вызывает задачу, прежде чем yargs сможет проверить этот требуемый параметр. Это стоило мне скудных часов, чтобы понять это.
Надеюсь, это поможет вам.
Ответ 10
Я знаю, что опаздываю, чтобы ответить на этот вопрос, но я хотел бы добавить что-то к ответу @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() может принимать объект, который сопоставляет ключи с псевдонимами. каждый ключом этого объекта должна быть каноническая версия опции, и каждое значение должно быть строкой или массивом строк.
Ответ 11
Просто загрузите его в новый объект в процессе. process.gulp = {}
и посмотрите, как выглядит задача.