it-roy-ru.com

Передать параметр в Gulp Task

Обычно мы можем запустить задачу gulp из консоли через что-то вроде gulp mytask. Есть ли в любом случае, что я могу передать в параметре для gulp задачи? Если возможно, покажите пример, как это можно сделать.

168
user1995781

Это особенность программ, без которых не обойтись. Вы можете попробовать ярги.

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, чтобы он выполнял задачи по-разному? )

243
Ethan

Если вы хотите избежать добавления дополнительных зависимостей, я нашел 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".

125
Trevedhek

Передача параметра в 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});

Это может пригодиться, если у вас много сложных задач и вы хотите передать им несколько удобных настроек среды. Я не уверен, может ли это работать между одной задачей и другой.

17
yuvilio

Для этого есть официальный рецепт глотка с использованием минималист .

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

Более полная информация в рецепте.

14
RobW

Если вы хотите использовать параметры среды и другие утилиты, такие как log, вы можете использовать gulp-util

/* 
  $npm install gulp-util --save-dev
  $gulp --varName 123
*/
var util = require('gulp-util');
util.log(util.env.varName);
14
Quy Tang

@ Ответ Итана полностью сработает. По моему опыту, более узкий способ заключается в использовании переменных среды. Это стандартный способ настройки программ, развернутых на хостинговых платформах (например, 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'

Этот ответ может дать вам другие идеи.

5
Michael Cole

Вот мой пример того, как я его использую. Для задачи 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);
});
4
Lynx

Вот еще один способ без дополнительных модулей:

Мне нужно было угадать окружение по имени задачи, у меня есть задача 'dev' и задача 'prod'.

Когда я запускаю gulp prod, он должен быть установлен в среду prod. Когда я запускаю gulp dev или что-то еще, он должен быть установлен в среду разработки.

Для этого я просто проверяю имя запущенной задачи:

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

Если вы используете глоток с яргами обратите внимание на следующее:

Если у вас есть задача 'customer' и вы не хотите использовать yargs для проверки параметров на наличие необходимых команд:

.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")

Это является причиной того, что gulp, кажется, запускает задачу, прежде чем yargs сможет проверить этот требуемый параметр. Мне понадобилось несколько часов, чтобы понять это.

Надеюсь, это поможет вам ..

1
suther

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

0
Code Spark