गुलम टास्क के लिए पैरामीटर पास करें


194

आम तौर पर हम कंसोल से gulp टास्क को कुछ इस तरह से चला सकते हैं gulp mytask। क्या ऐसा भी है कि मैं पैरामीटर में गल कार्य को पारित कर सकता हूं? यदि संभव हो, तो कृपया उदाहरण दिखाएं कि यह कैसे किया जा सकता है।



जवाबों:


269

यह एक सुविधा कार्यक्रम के बिना नहीं रह सकता है। आप यारों की कोशिश कर सकते हैं ।

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

आशा है कि आप इसे यहाँ से ले जा सकते हैं।

एक और प्लगइन है जिसका आप उपयोग कर सकते हैं, न्यूनतम। एक और पोस्ट है जहां यार्ग और मिनिमलिस्ट दोनों के लिए अच्छे उदाहरण हैं: ( क्या गुलप को एक ध्वज को पारित करना संभव है, इसके लिए अलग-अलग तरीके से कार्य करना है? )


13
वास्तव में अच्छी तरह से लिखित जवाब, उदाहरण के लिए धन्यवाद!
एलन राइस

जावास्क्रिप्ट में यह कैसे पहुँचता है?
विनी

यदि आप yargs के साथ gulp का उपयोग करते हैं, तो निम्न सूचना दें: यदि आपके पास कोई कार्य 'ग्राहक' है और आवश्यक आदेशों के लिए पैरामीटर जाँच में yargs बिल्ड का उपयोग करना नहीं चाहते हैं: कमांड ("ग्राहक", "ग्राहक निर्देशिका बनाएं")
sherher

मेरी टिप्पणी नीचे देखें, यदि आप आवश्यक आदेशों के लिए पैरामीटर चेक में निर्मित यार्न का उपयोग करना चाहते हैं एक साथ gulp के साथ: stackoverflow.com/a/41412558/1256697
suther

5
(argv.production === undefined) ? false : true;के बराबर है argv.production !== undefined
CJStuart

136

यदि आप अतिरिक्त निर्भरता को जोड़ने से बचना चाहते हैं, तो मुझे नोड 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

** संपादित करें: नोड स्क्रिप्ट के लिए सच है, लेकिन एक प्रमुख कार्य के रूप में "-" एक प्रमुख कार्य के बिना कुछ भी व्याख्या करता है। इसलिए प्रयोग gulp mytask 123विफल हो जाएगा क्योंकि gulp को '123' नामक कार्य नहीं मिल सकता है।


1
"टाइप विकल्प, i = प्रक्रिया, argv.indexOf (" - विकल्प ");" में एक टाइपो है। मेरा मानना ​​है कि यह सफल होना चाहिए।
लुइस पाउलो लोहमैन

आह, तो यह चाहिए। सही किया। साभार @luis
ट्रेवेडेक

मैं सिर्फ -देव ध्वज की जांच करना चाहता था, इसलिए मैं उत्पादन और निम्न वातावरण के बीच अंतर कर सकता था। यह अतिरिक्त निर्भरता को जोड़े बिना चाल करता है। धन्यवाद!
b01

1
मेरे लिए, gulp myTask --productionमें परिणाम process.argvबराबर करने के लिए[pathToNode, pathToGulp, 'myTask', '--production']
सुंग चो

2
यह शायद बदल गया है, मैंने कुछ पुराने उदाहरणों को समान अंतर के साथ देखा है। वैसे भी, आप इसे केवल डिबग कर सकते हैं और अपने मामले के लिए देख सकते हैं। यह स्वीकृत उत्तर होना चाहिए क्योंकि इसमें शून्य निर्भरता है ..
जुआन

19

एक पैरामीटर को गलप करने के लिए कुछ चीजों का मतलब हो सकता है:

  • कमांड लाइन से गल्पफाइल (पहले से ही यहां पर अनुकरणीय है)।
  • Gulpfile.js स्क्रिप्ट के मुख्य निकाय से लेकर gulp कार्यों तक।
  • एक gulp टास्क से दूसरे 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});

यह काम में आ सकता है यदि आपके पास बहुत अधिक गोल कार्य हैं और उन्हें कुछ आसान पर्यावरण कॉन्फ़िगर करना चाहते हैं। मुझे यकीन नहीं है कि यह एक काम और दूसरे के बीच काम कर सकता है।


16

मिनिमलिस्ट का उपयोग करने के लिए एक आधिकारिक गल्प नुस्खा है ।

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

मूल बातें न्यूनतम तर्क का उपयोग कर रहे हैं ताकि cli तर्कों को अलग किया जा सके और उन्हें ज्ञात विकल्पों के साथ जोड़ा जा सके:

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

जो कुछ इस तरह से पार्स करेगा

$ gulp scripts --env development

नुस्खा में अधिक पूरी जानकारी।


1
सूची के शीर्ष पर कचरा और तल पर उचित समाधान क्यों नहीं उठ रहा है? sigh
DDD

14

यदि आप पर्यावरण परमेस और अन्य बर्तनों के साथ-साथ लॉग का उपयोग करना चाहते हैं, तो आप गुल- उपयोग का उपयोग कर सकते हैं

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

अपडेट करें

gulp- उपयोग अब पदावनत हो गया है। आप इसके बजाय मिनिमिस्ट का उपयोग कर सकते हैं ।

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

1
2016 के बाद से गुल-उपयोग को हटा दिया गया है
Valdeci

5

@ एथन का जवाब पूरी तरह से काम करेगा। मेरे अनुभव से, अधिक नोड तरीका पर्यावरण चर का उपयोग करना है। यह होस्टिंग प्लेटफॉर्म (जैसे हरोकू या डॉक्यू) पर तैनात कार्यक्रमों को कॉन्फ़िगर करने का एक मानक तरीका है।

कमांड लाइन से पैरामीटर पास करने के लिए, इसे इस तरह करें:

विकास: gulp dev

उत्पादन: NODE_ENV=production gulp dev

वाक्यविन्यास अलग है, लेकिन बहुत यूनिक्स है, और यह हरोकू, डोकु, आदि के साथ संगत है।

आप चर को अपने कोड में एक्सेस कर सकते हैं process.env.NODE_ENV

MYAPP=something_else gulp dev

सेट हो जाएगा

process.env.MYAPP === 'something_else'

यह उत्तर आपको कुछ अन्य विचार दे सकता है।


4

यहाँ मेरा नमूना है कि मैं इसका उपयोग कैसे करता हूं। सीएसएस / कम कार्य के लिए। सभी के लिए आवेदन किया जा सकता है।

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

यहाँ अतिरिक्त मॉड्यूल के बिना एक और तरीका है:

मुझे कार्य नाम से पर्यावरण का अनुमान लगाने की आवश्यकता है, मेरे पास एक 'देव' कार्य और एक 'ठेस' कार्य है।

जब मैं gulp prodइसे चलाता हूं तो इसे पर्यावरण को ठेस पहुंचाना चाहिए। जब मैं दौड़ता हूं gulp devया कुछ और करता हूं तो इसे देव वातावरण में सेट किया जाना चाहिए।

उसके लिए मैं सिर्फ रनिंग टास्क का नाम देखता हूँ:

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

2

यदि आप यार्न के साथ गल्प का उपयोग करते हैं , तो निम्नलिखित पर ध्यान दें:

यदि आपके पास एक कार्य 'ग्राहक' है और आवश्यक आदेशों के लिए पैरामीटर जाँच में यारों के निर्माण का उपयोग नहीं करना चाहते हैं:

.command("customer <place> [language]","Create a customer directory") इसके साथ कॉल करें:

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

यारवे एक त्रुटि को फेंक देंगे, कि कॉल करने के लिए पर्याप्त आदेश नहीं दिए गए थे, भले ही आपके पास हो !! -

इसे आज़माएँ और कमांड में केवल एक अंक जोड़ें (इसे गोल-टास्क नाम के बराबर नहीं बनाने के लिए) ... ... और यह काम करेगा:

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

यह कार्य को ट्रिगर करने के लिए गल्प का कारण बनता है, इससे पहले कि यार्ग इस आवश्यक पैरामीटर की जांच करने में सक्षम हो। यह पता लगाने के लिए मुझे surveral घंटे खर्च करने पड़ते हैं।

आशा है कि यह आपकी मदद करेगा ..


0

मुझे पता है कि मुझे इस प्रश्न का उत्तर देने में देर हो गई है, लेकिन मैं सबसे अधिक मतदान और स्वीकृत उत्तर @ ईथन के उत्तर में कुछ जोड़ना चाहूंगा।

हम yargsकमांड लाइन पैरामीटर प्राप्त करने के लिए उपयोग कर सकते हैं और इसके साथ ही हम कुछ मापदंडों के लिए अपना स्वयं का उपनाम भी जोड़ सकते हैं जैसे कि पालन करें।

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 () एक ऐसा ऑब्जेक्ट ले सकता है जो उपनामों की कुंजी देता है। इस ऑब्जेक्ट की प्रत्येक कुंजी विकल्प का विहित संस्करण होना चाहिए, और प्रत्येक मान स्ट्रिंग या स्ट्रिंग का एक सरणी होना चाहिए।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.