gulp mytask
ปกติเราสามารถเรียกใช้งานอึกจากคอนโซลผ่านสิ่งที่ต้องการ มีอยู่หรือไม่ที่ฉันสามารถส่งผ่านพารามิเตอร์ให้กับงานอึก? ถ้าเป็นไปได้โปรดแสดงตัวอย่างว่าสามารถทำได้
gulp mytask
ปกติเราสามารถเรียกใช้งานอึกจากคอนโซลผ่านสิ่งที่ต้องการ มีอยู่หรือไม่ที่ฉันสามารถส่งผ่านพารามิเตอร์ให้กับงานอึก? ถ้าเป็นไปได้โปรดแสดงตัวอย่างว่าสามารถทำได้
คำตอบ:
เป็นโปรแกรมคุณลักษณะที่ไม่สามารถคงอยู่ได้หากไม่มี คุณสามารถลอง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 เพื่อให้มันทำงานในรูปแบบที่แตกต่างกัน? )
(argv.production === undefined) ? false : true;
argv.production !== undefined
เทียบเท่ากับ
หากคุณต้องการหลีกเลี่ยงการเพิ่มการพึ่งพาพิเศษฉันพบว่าโหนด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'
gulp myTask --production
ผลลัพธ์process.argv
เท่ากับ[pathToNode, pathToGulp, 'myTask', '--production']
การส่งพารามิเตอร์ไปที่อึกอาจหมายถึงบางสิ่ง:
ต่อไปนี้เป็นวิธีการส่งผ่านพารามิเตอร์จาก 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});
สิ่งนี้มีประโยชน์หากคุณมีงานอึกจำนวนมากและต้องการผ่านการกำหนดค่าทางสิ่งแวดล้อมที่มีประโยชน์ ฉันไม่แน่ใจว่าสามารถทำงานระหว่างงานหนึ่งกับงานอื่นได้หรือไม่
มีสูตรอึกอย่างเป็นทางการสำหรับการนี้โดยใช้เป็น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
ข้อมูลที่สมบูรณ์มากขึ้นในสูตร
หากคุณต้องการใช้พารามิเตอร์สภาพแวดล้อมและอุปกรณ์อื่น ๆ เช่นบันทึกคุณสามารถใช้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);
@ คำตอบของอีธานจะทำงานได้อย่างสมบูรณ์ จากประสบการณ์ของฉันวิธีโหนดมากขึ้นคือการใช้ตัวแปรสภาพแวดล้อม เป็นวิธีมาตรฐานในการกำหนดค่าโปรแกรมที่ปรับใช้บนแพลตฟอร์มการโฮสต์ (เช่น 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'
คำตอบนี้อาจทำให้คุณมีความคิดอื่น ๆ
นี่คือตัวอย่างของฉันว่าฉันใช้มันอย่างไร สำหรับงาน 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);
});
นี่เป็นอีกวิธีหนึ่งที่ไม่มีโมดูลพิเศษ:
ฉันต้องการที่จะคาดเดาสภาพแวดล้อมจากชื่องานฉันมีงาน 'dev' และงาน 'prod'
เมื่อฉันเรียกใช้gulp prod
ควรตั้งค่าสภาพแวดล้อมที่แยง เมื่อฉันเรียกใช้gulp dev
หรืออะไรก็ตามที่ควรถูกตั้งค่าเป็นสภาพแวดล้อม dev
สำหรับสิ่งที่ฉันเพิ่งตรวจสอบชื่องานที่ทำงาน:
devEnv = process.argv[process.argv.length-1] !== 'prod';
หากคุณใช้อึกกับ 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 สามารถตรวจสอบพารามิเตอร์ที่จำเป็นนี้ ฉันใช้เวลาหลายชั่วโมงในการคิดเรื่องนี้
หวังว่านี่จะช่วยคุณ ..
ฉันรู้ว่าฉันมาสายเพื่อตอบคำถามนี้ แต่ฉันต้องการเพิ่มบางสิ่งเพื่อตอบของ @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 แต่ละคีย์ของวัตถุนี้ควรเป็นรุ่นมาตรฐานของตัวเลือกและแต่ละค่าควรเป็นสตริงหรืออาร์เรย์ของสตริง
เพียงแค่โหลดมันเป็นวัตถุใหม่ในกระบวนการ .. process.gulp = {}
และให้ดูที่งาน