Подтвердить что ты не робот

Задайте параметр Gulp Задача

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

4b9b3361

Ответ 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 = {} и посмотрите, как выглядит задача.