Parametreyi Gulp Görevine Geçir


Yanıtlar:


269

Programların onsuz kalamayacağı bir özellik. Yargları deneyebilirsiniz .

npm install --save-dev yargs

Bu şekilde kullanabilirsiniz:

gulp mytask --production --test 1234

Kodda, örneğin:

var argv = require('yargs').argv;
var isProduction = (argv.production === undefined) ? false : true;

Anlaman için:

> 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

Umarım buradan alabilirsin.

Kullanabileceğiniz başka bir eklenti daha var, minimist. Hem iplikler hem de minimist için iyi örneklerin bulunduğu başka bir yazı var: ( Görevleri farklı şekillerde yürütmesi için Gulp'e bir bayrak geçmek mümkün mü? )


13
Gerçekten iyi yazılmış cevap, örnekler için teşekkürler!
Allen Rice

javascript ile buna nasıl erişilir?
vini

İplerle birlikte gulp kullanıyorsanız, aşağıdakilere dikkat edin: 'müşteri' göreviniz varsa ve gerekli komutlar için parametre denetimi içinde yargs build'i kullanmak istemiyorsanız: command ("customer", "Müşteri dizini oluşturma")
suther

Gulp ile birlikte gerekli 'komutlar' için parametre kontrolünde yerleşik olan iplikleri kullanmak istiyorsanız, aşağıdaki yorumuma bakın: stackoverflow.com/a/41412558/1256697
suther

5
(argv.production === undefined) ? false : true;eşittir argv.production !== undefined.
JimmyMcHoover

136

Ekstra bağımlılıklar eklemekten kaçınmak istiyorsanız, düğümün process.argvyararlı olduğunu gördüm :

gulp.task('mytask', function() {
    console.log(process.argv);
});

Yani aşağıdakiler:

gulp mytask --option 123

göstermelidir:

[ 'node', 'path/to/gulp.js', 'mytask', '--option', '123']

İstenen parametrenin doğru konumda olduğundan eminseniz, bayraklara gerek yoktur. ** Sadece kullanın (bu durumda):

var option = process.argv[4]; //set to '123'

AMA: seçenek ayarlanamayabileceği veya farklı bir konumda olabileceği için, daha iyi bir fikrin aşağıdaki gibi olacağını düşünüyorum:

var option, i = process.argv.indexOf("--option");
if(i>-1) {
    option = process.argv[i+1];
}

Bu şekilde, aşağıdakiler gibi birden çok seçenekte varyasyonları işleyebilirsiniz:

//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

** Düzenleme: düğüm komut dosyaları için doğrudur, ancak gulp, başka bir görev adı olarak baştaki "-" olmadan herhangi bir şeyi yorumlar. Böylece kullanma gulp mytask 123başarısız olur, çünkü gulp '123' adlı bir görev bulamaz.


1
"Var option, i = process, argv.indexOf (" - option ");" yazım hatası var. Proccess.argv olması gerektiğine inanıyorum.
Luis Paulo Lohmann

Ah, öyle olmalı. Düzeltildi. Thanks @luis
Trevedhek

Sadece --dev bayrağını kontrol etmek istedim, böylece üretim ve daha düşük ortamları ayırt edebildim. Bu, ek bağımlılıklar eklemeden hile yapar. Teşekkür!
b01

1
Benim için, gulp myTask --production için process.argveşittir[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho

2
Muhtemelen değişti, aynı farkla bazı eski örnekler gördüm. Her neyse, hata ayıklayabilir ve davanız için görebilirsiniz. Sıfır bağımlılıkları vardır gibi bu kabul cevap olmalı ..
Juan

19

Bir parametreyi yutmaya geçirmek birkaç anlama gelebilir:

  • Komut satırından gulpfile'a (burada zaten örneklenmiştir).
  • Gulpfile.js betiğinin ana gövdesinden gulp görevlerine.
  • Bir yudum görevinden başka bir yutkunma görevine

İşte parametreleri ana gulpfile'dan gulp bir göreve geçirme yaklaşımı. Parametreye ihtiyaç duyan görevi kendi modülüne taşıyarak ve bir işlevde sararak (bir parametre geçirilebilir):

// ./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});

Çok sayıda yutkunma göreviniz varsa ve onlara bazı kullanışlı çevresel yapılandırmalar vermek istiyorsanız bu kullanışlı olabilir. Bir görev ile bir diğeri arasında çalışıp çalışmadığından emin değilim.


16

Minimist kullanarak bunun için resmi bir yudum tarifi var .

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

Temel bilgiler, cli argümanlarını ayırmak ve bunları bilinen seçeneklerle birleştirmek için minimist kullanıyor:

var options = minimist(process.argv.slice(2), knownOptions);

Hangi gibi bir şey ayrıştıracak

$ gulp scripts --env development

Tarifte daha eksiksiz bilgi.


1
Neden listenin üstündeki çöp ve alt kısımdaki uygun çözüm kaldırılmıyor? iç çeker
DDD

14

Ortam parametrelerini ve günlük gibi diğer araçları kullanmak istiyorsanız, gulp-util'i kullanabilirsiniz.

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

Güncelleme

gulp-util artık kullanımdan kaldırıldı. Bunun yerine minimist kullanabilirsiniz .

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);

1
gulp

5

@ Ethan'ın cevabı tamamen işe yarayacaktı. Deneyimlerime göre, daha fazla düğüm yolu ortam değişkenlerini kullanmaktır. Barındırma platformlarına (örneğin Heroku veya Dokku) dağıtılan programları yapılandırmanın standart bir yoludur.

Parametreyi komut satırından geçirmek için şu şekilde yapın:

Geliştirme: gulp dev

Üretim: NODE_ENV=production gulp dev

Sözdizimi farklıdır, ancak çok Unix ve Heroku, Dokku, vb. İle uyumludur.

Kodunuzdaki değişkene şuradan erişebilirsiniz: process.env.NODE_ENV

MYAPP=something_else gulp dev

ayarlayacaktı

process.env.MYAPP === 'something_else'

Bu cevap size başka fikirler verebilir.


4

İşte nasıl benim örnek. Css / less görevi için. Herkes için uygulanabilir.

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

Ekstra modüller olmadan başka bir yol:

Çevreyi görev adından tahmin etmem gerekiyordu, bir 'geliştirici' görevim ve 'prod' bir görevim var.

Ben gulp prodkoştuğumda prod ortamına ayarlanmalıdır. Koştuğum zaman gulp devya da başka bir şey geliştirici ortamına ayarlanmalıdır.

Bunun için sadece çalışan görev adını kontrol ediyorum:

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

2

İplikli yudum kullanıyorsanız aşağıdakilere dikkat edin:

Bir 'müşteri' göreviniz varsa ve gerekli komutlar için Parametre denetiminde yargs build'i kullanmak istemiyorsanız:

.command("customer <place> [language]","Create a customer directory") şununla ara:

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

Yargs, her ne kadar olsanız bile, çağrıya yeterli komut atanmadığını bir hata atar !! -

Bir deneyin ve komuta sadece bir rakam ekleyin (yutmak-görev adına eşit olmamak için) ... ve işe yarayacak:

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

Bu yırtılma sebebi, iplikler bu gerekli Parametreyi kontrol edebilmeden önce görevi tetikliyor gibi görünüyor. Bunu anlamak bana saatler sürdü.

Umarım bu sana yardımcı olur ..


0

Bu soruyu cevaplamak için geç kaldığımı biliyorum ama en çok oy alan ve kabul edilen cevap @Ethan'ın yanıtına bir şeyler eklemek istiyorum.

yargsKomut satırı parametresini almak için kullanabiliriz ve bununla birlikte follow gibi bazı parametreler için kendi takma adımızı da ekleyebiliriz.

var args = require('yargs')
    .alias('r', 'release')
    .alias('d', 'develop')
    .default('release', false)
    .argv;

Daha fazla bilgi için lütfen bu bağlantıya bakın. https://github.com/yargs/yargs/blob/HEAD/docs/api.md

Aşağıda, dokümantasyonda verilen takma ad kullanımı yer almaktadır yargs. Ayrıca yargsburada daha fazla işlev bulabilir ve komut satırı geçiş deneyimini daha da iyi hale getirebiliriz.

.alias (anahtar, takma ad)

Bir anahtarda yapılan güncellemeler diğer adlara ya da tam tersine yayılacak şekilde anahtar adlarını eşdeğer olarak ayarlayın.

İsteğe bağlı olarak .alias (), anahtarları takma adlarla eşleştiren bir nesneyi alabilir. Bu nesnenin her anahtarı seçeneğin standart sürümü olmalı ve her değer bir dize veya bir dize dizisi olmalıdır.


-2

İşlemde yeni bir nesneye yükleyin process.gulp = {}ve görevin orada görünmesini sağlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.