2015-02-16 3 views
128

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

+3

https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md – Heikki

ответ

194

Это функциональные программы не могут оставаться без. Вы можете попробовать 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 

Надеется, что вы можете взять это отсюда.

Существует еще один плагин, который вы можете использовать, минималистский. Есть еще одна должность, где есть хорошие примеры как для яргов, так и для минималистов: (Is it possible to pass a flag to Gulp to have it run tasks in different ways?)

+9

Действительно хорошо письменный ответ, спасибо за примерами! –

+0

Как получить доступ к этому в javascript? – vini

+0

Если вы используете gulp with yargs, обратите внимание на следующее: если у вас есть задача «клиент» и wan't для использования сборки yargs в проверке параметров для требуемых команд: command («клиент», «Создать каталог клиента») – suther

4

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

This answer может дать вам некоторые другие идеи.

3

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

Для этого используется официальный рецепт глотки с использованием 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 

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

+0

Почему мусор в верхней части списка и правильное решение на дне не поднимаются? sigh – Azarus

-2

Просто загрузите его в новый объект в процессе. process.gulp = {} и попросите его посмотреть.

101

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

** Edit: верно для узла скриптов, но глоток интерпретирует что-либо без ведущего «-» как другого названия задачи , Таким образом, использование gulp mytask 123 не удастся, потому что gulp не может найти задачу под названием «123».

+1

Существует опечатка в опции var, i = process, argv.indexOf ("- option"); ". Я считаю, что это должно быть proccess.argv. –

+0

Ах, так и должно. Исправленный. Спасибо @luis –

+0

Я просто хотел проверить флаг -dev, чтобы я мог различать производственную и более низкую среду. Это делает трюк без добавления дополнительных зависимостей. Спасибо! – b01

13

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

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

Передача параметра проглатывать может означать несколько вещей:

  • От командной строки в файл gulpfile (уже приведенный здесь пример).
  • От основного тела скрипта gulpfile.js до задач глотания.
  • От одной задачи глобализации до другой задачи глотка.

Вот подход к передаче параметров из основного файла 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}); 

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

+0

Бонусные баллы за вас! Спасибо – danjah

0

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

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

.command("customer <place> [language]","Create a customer directory") называть его:

gulp customer --customer Bob --place Chicago --language english 

yargs будет Аллуэй выдаст ошибку, что не хватает команды был назначен на вызов, даже если у вас есть !! -

Дайте ему попробовать и добавить только цифру в команде (чтобы не совпадающий с именем Глоток-задачи) ... и он будет работать:

.command("customer1 <place> [language]","Create a customer directory")

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

Надеется, что это помогает ..

1

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

мне нужно было угадать среды от имени задачи, у меня есть «Dev» задача и «» задачи лезвия ,

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

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

devEnv = process.argv[process.argv.length-1] !== 'prod'; 
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() может принимать объект, который сопоставляет ключи с псевдонимами. Каждый ключ этого объекта должен быть канонической версией опции, а каждое значение должно быть строкой или массивом строк.

Смежные вопросы