Normalde gulp görevini konsoldan benzer bir şeyle çalıştırabiliriz gulp mytask
. Zaten görev yutmak için parametre geçebilir miyim? Mümkünse, lütfen bunun nasıl yapılabileceğini gösterin.
Normalde gulp görevini konsoldan benzer bir şeyle çalıştırabiliriz gulp mytask
. Zaten görev yutmak için parametre geçebilir miyim? Mümkünse, lütfen bunun nasıl yapılabileceğini gösterin.
Yanıtlar:
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ü? )
(argv.production === undefined) ? false : true;
eşittir argv.production !== undefined
.
Ekstra bağımlılıklar eklemekten kaçınmak istiyorsanız, düğümün process.argv
yararlı 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 123
başarısız olur, çünkü gulp '123' adlı bir görev bulamaz.
gulp myTask --production
için process.argv
eşittir[pathToNode, pathToGulp, 'myTask', '--production']
Bir parametreyi yutmaya geçirmek birkaç anlama gelebilir:
İş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.
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.
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);
gulp-util artık kullanımdan kaldırıldı. Bunun yerine minimist kullanabilirsiniz .
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
@ 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.
İş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);
});
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 prod
koştuğumda prod ortamına ayarlanmalıdır. Koştuğum zaman gulp dev
ya 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';
İ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 ..
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.
yargs
Komut 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 yargs
burada 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.
İşlemde yeni bir nesneye yükleyin process.gulp = {}
ve görevin orada görünmesini sağlayın.