Передайте параметр завдання Gulp


194

Зазвичай ми можемо виконувати завдання gulp з консолі через щось подібне gulp mytask. Чи все-таки я можу передати параметр для завдання gulp? Якщо можливо, покажіть приклад, як це можна зробити.



Відповіді:


269

Це функціональні програми, без яких не можна залишатися. Можна спробувати ярги .

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, щоб він виконував завдання різними способами? )


13
Дійсно добре написана відповідь, дякую за приклади!
Аллен Райс

як можна отримати доступ до цього в JavaScript?
vini

Якщо ви використовуєте gulp з yargs, зверніть увагу на таке: Якщо у вас є завдання "customer" і не хочете використовувати yargs build в "Параметри перевірки" необхідних команд: command ("customer", "Create a
user

Дивіться мій коментар нижче, якщо ви хочете використовувати yargs вбудовані в перевірці параметрів для необхідних «команд» разом з ковтком: stackoverflow.com/a/41412558/1256697
Süther

5
(argv.production === undefined) ? false : true;еквівалентно argv.production !== undefined.
JimmyMcHoover

136

Якщо ви хочете уникати додаткових залежностей, я вважаю, що вузол є 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".


1
Існує помилка в "var варіант, i = процес, argv.indexOf (" - варіант ");". Я вважаю, що це має бути proccess.argv.
Луїс Пауло Ломан

Ага, так і повинно. Виправлено. Дякуємо @luis
Треведхек

Я просто хотів перевірити прапор --dev, щоб я міг розрізняти виробництво та нижчі середовища. Це робить трюк без додавання додаткових залежностей. Спасибі!
b01

1
Для мене gulp myTask --productionрезультати process.argvдорівнюють[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho

2
Це, мабуть, змінилося, я бачив кілька старих прикладів з однаковою різницею. У будь-якому випадку, ви можете просто налагодити його і побачити ваш випадок. Це має бути прийнятою відповіддю, оскільки вона має нульові залежності ..
Хуан

19

Передача параметра gulp може означати кілька речей:

  • З командного рядка до gulpfile (тут вже наводиться приклад).
  • Від основної частини сценарію 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});

Це може стати в нагоді, якщо у вас є багато завдань із глоткою та хочете передати їм кілька зручних конфігурацій середовища. Я не впевнений, чи може це працювати між одним і іншим завданням.


16

Існує офіційний рецепт глотків для цього з використанням мінімалізму .

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

Більш повна інформація в рецепті.


1
Чому сміття вгорі списку та правильне рішення внизу не отримують переваги? зітхання
DDD

14

Якщо ви хочете використовувати параметри середовища та інші утиліти, такі як журнал, ви можете використовувати 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);

1
gulp-util застаріло з 2016 року
valdeci

5

@ Відповідь Етана повністю спрацює. З мого досвіду, більш вузловим способом є використання змінних середовища. Це стандартний спосіб налаштування програм, розміщених на хостингових платформах (наприклад, 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'

Ця відповідь може дати вам інші ідеї.


4

Ось мій зразок того, як я ним користуюся. Для завдання 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);
});

3

Ось ще один спосіб без додаткових модулів:

Мені потрібно було вгадати середовище з назви завдання, у мене є завдання "dev" і "prod".

Коли я запускаю, gulp prodйого слід встановити на середовище prod. Коли я запускаю gulp devабо щось інше, його слід встановити в середовищі розробників.

Для цього я просто перевіряю ім'я запущеного завдання:

devEnv = process.argv[process.argv.length-1] !== 'prod';

2

Якщо ви використовуєте глоток з яргами, помічайте наступне:

Якщо у вас є завдання "клієнт" і ви не хочете використовувати 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")

Ця причина, як заклинання, здається, викликає завдання, перш ніж ярги зможуть перевірити цей необхідний параметр. Мені це коштувало оглядових годин, щоб зрозуміти це.

Сподіваюся, це допоможе вам ..


0

Я знаю, що я спізнююсь відповісти на це запитання, але хотів би додати щось, щоб відповісти на @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 () може взяти об’єкт, який відображає ключі на псевдоніми. Кожен ключ цього об’єкта повинен бути канонічною версією параметра, а кожне значення має бути рядком або масивом рядків.


-2

Просто завантажте його в новий об’єкт на процесі .. process.gulp = {}і отримайте завдання шукати там.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.