Зазвичай ми можемо виконувати завдання gulp з консолі через щось подібне gulp mytask
. Чи все-таки я можу передати параметр для завдання gulp? Якщо можливо, покажіть приклад, як це можна зробити.
Зазвичай ми можемо виконувати завдання gulp з консолі через щось подібне gulp mytask
. Чи все-таки я можу передати параметр для завдання gulp? Якщо можливо, покажіть приклад, як це можна зробити.
Відповіді:
Це функціональні програми, без яких не можна залишатися. Можна спробувати ярги .
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
Сподіваюся, ви можете взяти це звідси.
Є ще один плагін, який ви можете використовувати, мініміст. Є ще одна публікація, де є хороші приклади як для яргів, так і для мінімалістів: ( Чи можна передати прапор 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
** Редагувати: вірно для сценаріїв вузлів, але 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
Більш повна інформація в рецепті.
Якщо ви хочете використовувати параметри середовища та інші утиліти, такі як журнал, ви можете використовувати gulp-util
/*
$npm install gulp-util --save-dev
$gulp --varName 123
*/
var util = require('gulp-util');
util.log(util.env.varName);
gulp-util тепер застарілий. Ви можете використовувати мініміст замість цього.
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
@ Відповідь Етана повністю спрацює. З мого досвіду, більш вузловим способом є використання змінних середовища. Це стандартний спосіб налаштування програм, розміщених на хостингових платформах (наприклад, 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);
});
Ось ще один спосіб без додаткових модулів:
Мені потрібно було вгадати середовище з назви завдання, у мене є завдання "dev" і "prod".
Коли я запускаю, gulp prod
його слід встановити на середовище prod. Коли я запускаю gulp dev
або щось інше, його слід встановити в середовищі розробників.
Для цього я просто перевіряю ім'я запущеного завдання:
devEnv = process.argv[process.argv.length-1] !== 'prod';
Якщо ви використовуєте глоток з яргами, помічайте наступне:
Якщо у вас є завдання "клієнт" і ви не хочете використовувати yargs build в параметрі перевірки необхідних команд:
.command("customer <place> [language]","Create a customer directory")
зателефонуйте за допомогою:
gulp customer --customer Bob --place Chicago --language english
yargs все одно призведе до помилки, що для виклику було призначено недостатньо команд, навіть якщо у вас є !! -
Спробуйте і додайте до команди лише цифру (щоб вона не дорівнювала назві задачі gulp) ... і вона спрацює:
.command("customer1 <place> [language]","Create a customer directory")
Ця причина, як заклинання, здається, викликає завдання, перш ніж ярги зможуть перевірити цей необхідний параметр. Мені це коштувало оглядових годин, щоб зрозуміти це.
Сподіваюся, це допоможе вам ..
Я знаю, що я спізнююсь відповісти на це запитання, але хотів би додати щось, щоб відповісти на @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 () може взяти об’єкт, який відображає ключі на псевдоніми. Кожен ключ цього об’єкта повинен бути канонічною версією параметра, а кожне значення має бути рядком або масивом рядків.
Просто завантажте його в новий об’єкт на процесі .. process.gulp = {}
і отримайте завдання шукати там.