ส่งผ่านพารามิเตอร์ไปที่งานอึก


194

gulp mytaskปกติเราสามารถเรียกใช้งานอึกจากคอนโซลผ่านสิ่งที่ต้องการ มีอยู่หรือไม่ที่ฉันสามารถส่งผ่านพารามิเตอร์ให้กับงานอึก? ถ้าเป็นไปได้โปรดแสดงตัวอย่างว่าสามารถทำได้



คำตอบ:


269

เป็นโปรแกรมคุณลักษณะที่ไม่สามารถคงอยู่ได้หากไม่มี คุณสามารถลอง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

หวังว่าคุณจะเอามันมาจากที่นี่

มีปลั๊กอินอื่นที่คุณสามารถใช้, ย่อเล็กสุด มีอีกโพสต์ที่มีตัวอย่างที่ดีสำหรับทั้ง yargs และ minimist: ( เป็นไปได้ไหมที่จะส่งค่าสถานะไปที่ Gulp เพื่อให้มันทำงานในรูปแบบที่แตกต่างกัน? )


13
คำตอบที่เขียนได้ดีจริงๆขอบคุณสำหรับตัวอย่าง!
อัลเลนไรซ์

คนเราจะเข้าถึงได้อย่างไรใน javascript
vini

หากคุณใช้อึกกับ yargs ให้สังเกตสิ่งต่อไปนี้: ถ้าคุณมีงาน 'ลูกค้า' และไม่ต้องการใช้ yargs บิลด์ในการตรวจสอบพารามิเตอร์สำหรับคำสั่งที่ต้องการ: คำสั่ง ("ลูกค้า", "สร้างไดเรกทอรีลูกค้า")
suther

ดูความคิดเห็นของฉันด้านล่างหากคุณต้องการใช้ yargs ในตัวตรวจสอบพารามิเตอร์เพื่อหา 'command' พร้อมกับ gulp: stackoverflow.com/a/41412558/1256697
suther

5
(argv.production === undefined) ? false : true;argv.production !== undefinedเทียบเท่ากับ
JimmyMcHoover

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จะล้มเหลวเนื่องจากอึกไม่สามารถหางานที่เรียกว่า '123'


1
มีการพิมพ์ผิดใน "ตัวเลือก var, i = กระบวนการ, argv.indexOf (" - ตัวเลือก ");" ฉันเชื่อว่ามันควรจะเป็น proccess.argv
Luis Paulo Lohmann

อาดังนั้นควร การแก้ไข ขอบคุณ @luis
Trevedhek

ฉันแค่ต้องการตรวจสอบธง --dev ดังนั้นฉันจึงสามารถแยกความแตกต่างระหว่างการผลิตและสภาพแวดล้อมที่ต่ำกว่า นี่เป็นการหลอกลวงโดยไม่เพิ่มการพึ่งพาพิเศษ ขอบคุณ!
b01

1
สำหรับฉันgulp myTask --productionผลลัพธ์process.argvเท่ากับ[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho

2
มันอาจจะเปลี่ยนไปฉันได้เห็นตัวอย่างเก่า ๆ ที่มีความแตกต่างเหมือนกัน อย่างไรก็ตามคุณสามารถแก้ไขข้อบกพร่องและดูกรณีของคุณ นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับตามที่มีศูนย์อ้างอิง ..

19

การส่งพารามิเตอร์ไปที่อึกอาจหมายถึงบางสิ่ง:

  • จากบรรทัดคำสั่งไปยัง 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});

สิ่งนี้มีประโยชน์หากคุณมีงานอึกจำนวนมากและต้องการผ่านการกำหนดค่าทางสิ่งแวดล้อมที่มีประโยชน์ ฉันไม่แน่ใจว่าสามารถทำงานระหว่างงานหนึ่งกับงานอื่นได้หรือไม่


16

มีสูตรอึกอย่างเป็นทางการสำหรับการนี้โดยใช้เป็น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

ข้อมูลที่สมบูรณ์มากขึ้นในสูตร


1
เหตุใดขยะด้านบนของรายการและโซลูชันที่เหมาะสมที่ด้านล่างไม่ได้รับการอัปเดต ถอนหายใจ
DDD

14

หากคุณต้องการใช้พารามิเตอร์สภาพแวดล้อมและอุปกรณ์อื่น ๆ เช่นบันทึกคุณสามารถใช้gulp-util

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

ปรับปรุง

gulp-util เลิกใช้แล้ว คุณสามารถใช้minimistแทน

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

1
gulp-util เลิกใช้แล้วตั้งแต่ 2559
valdeci

5

@ คำตอบของอีธานจะทำงานได้อย่างสมบูรณ์ จากประสบการณ์ของฉันวิธีโหนดมากขึ้นคือการใช้ตัวแปรสภาพแวดล้อม เป็นวิธีมาตรฐานในการกำหนดค่าโปรแกรมที่ปรับใช้บนแพลตฟอร์มการโฮสต์ (เช่น 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'

คำตอบนี้อาจทำให้คุณมีความคิดอื่น ๆ


4

นี่คือตัวอย่างของฉันว่าฉันใช้มันอย่างไร สำหรับงาน 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);
});

3

นี่เป็นอีกวิธีหนึ่งที่ไม่มีโมดูลพิเศษ:

ฉันต้องการที่จะคาดเดาสภาพแวดล้อมจากชื่องานฉันมีงาน 'dev' และงาน 'prod'

เมื่อฉันเรียกใช้gulp prodควรตั้งค่าสภาพแวดล้อมที่แยง เมื่อฉันเรียกใช้gulp devหรืออะไรก็ตามที่ควรถูกตั้งค่าเป็นสภาพแวดล้อม dev

สำหรับสิ่งที่ฉันเพิ่งตรวจสอบชื่องานที่ทำงาน:

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

2

หากคุณใช้อึกกับ yargsสังเกตเห็นดังต่อไปนี้:

หากคุณมีงาน 'ลูกค้า' และไม่ต้องการใช้ 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")

นี่เป็นสาเหตุของการอึกดูเหมือนว่าจะเรียกงานก่อนที่จะ yargs สามารถตรวจสอบพารามิเตอร์ที่จำเป็นนี้ ฉันใช้เวลาหลายชั่วโมงในการคิดเรื่องนี้

หวังว่านี่จะช่วยคุณ ..


0

ฉันรู้ว่าฉันมาสายเพื่อตอบคำถามนี้ แต่ฉันต้องการเพิ่มบางสิ่งเพื่อตอบของ @Ethan ซึ่งเป็นคำตอบที่ได้รับการโหวตสูงสุดและเป็นที่ยอมรับ

เราสามารถใช้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 (กุญแจ, นามแฝง)

ตั้งค่าชื่อคีย์ให้เท่าเทียมกันซึ่งการอัปเดตเป็นคีย์จะเผยแพร่ไปยังชื่อแทนและในทางกลับกัน

ทางเลือก. alias () สามารถนำวัตถุที่แม็พคีย์ไปที่ alias แต่ละคีย์ของวัตถุนี้ควรเป็นรุ่นมาตรฐานของตัวเลือกและแต่ละค่าควรเป็นสตริงหรืออาร์เรย์ของสตริง


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.