Thông thường chúng ta có thể chạy tác vụ gulp từ bàn điều khiển thông qua một cái gì đó như gulp mytask
. Có dù sao tôi có thể chuyển tham số cho nhiệm vụ gulp? Nếu có thể, xin vui lòng cho thấy ví dụ làm thế nào nó có thể được thực hiện.
Thông thường chúng ta có thể chạy tác vụ gulp từ bàn điều khiển thông qua một cái gì đó như gulp mytask
. Có dù sao tôi có thể chuyển tham số cho nhiệm vụ gulp? Nếu có thể, xin vui lòng cho thấy ví dụ làm thế nào nó có thể được thực hiện.
Câu trả lời:
Đây là một chương trình tính năng không thể ở mà không có. Bạn co thể thử yargs .
npm install --save-dev yargs
Bạn có thể sử dụng nó như thế này:
gulp mytask --production --test 1234
Trong mã, ví dụ:
var argv = require('yargs').argv;
var isProduction = (argv.production === undefined) ? false : true;
Cho sự hiểu biết của bạn:
> 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
Hy vọng bạn có thể lấy nó từ đây.
Có một plugin khác mà bạn có thể sử dụng, minimist. Có một bài viết khác trong đó có các ví dụ hay cho cả yargs và minimist: ( Có thể chuyển cờ cho Gulp để nó chạy các tác vụ theo những cách khác nhau không? )
(argv.production === undefined) ? false : true;
tương đương với argv.production !== undefined
.
Nếu bạn muốn tránh thêm phụ thuộc, tôi thấy nút process.argv
là hữu ích:
gulp.task('mytask', function() {
console.log(process.argv);
});
Vì vậy, sau đây:
gulp mytask --option 123
nên hiển thị:
[ 'node', 'path/to/gulp.js', 'mytask', '--option', '123']
Nếu bạn chắc chắn rằng tham số mong muốn ở đúng vị trí, thì cờ không cần thiết. ** Chỉ cần sử dụng (trong trường hợp này):
var option = process.argv[4]; //set to '123'
NHƯNG: vì tùy chọn có thể không được đặt hoặc có thể ở một vị trí khác, tôi cảm thấy rằng một ý tưởng tốt hơn sẽ là một cái gì đó như:
var option, i = process.argv.indexOf("--option");
if(i>-1) {
option = process.argv[i+1];
}
Bằng cách đó, bạn có thể xử lý các biến thể trong nhiều tùy chọn, như:
//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
** Chỉnh sửa: đúng cho tập lệnh nút, nhưng gulp diễn giải bất cứ điều gì mà không có "-" hàng đầu như một tên tác vụ khác. Vì vậy, việc sử dụng gulp mytask 123
sẽ thất bại vì gulp không thể tìm thấy một nhiệm vụ gọi là '123'.
gulp myTask --production
kết quả process.argv
tương đương với[pathToNode, pathToGulp, 'myTask', '--production']
Truyền tham số cho gulp có thể có nghĩa là một vài điều:
Đây là một cách tiếp cận chuyển các tham số từ gulpfile chính sang tác vụ gulp. Bằng cách di chuyển tác vụ cần tham số đến mô-đun của chính nó và gói nó trong một hàm (để có thể truyền tham số):.
// ./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});
Điều này có thể có ích nếu bạn có nhiều nhiệm vụ gulp và muốn chuyển cho chúng một số cấu hình môi trường tiện dụng. Tôi không chắc liệu nó có thể hoạt động giữa nhiệm vụ này với nhiệm vụ khác không.
Có một công thức chính thức cho việc này bằng cách sử dụng công cụ thu nhỏ .
https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-argument-from-cli.md
Những điều cơ bản đang sử dụng công cụ thu nhỏ để phân tách các đối số cli và kết hợp chúng với các tùy chọn đã biết:
var options = minimist(process.argv.slice(2), knownOptions);
Mà sẽ phân tích cái gì đó như
$ gulp scripts --env development
Thông tin đầy đủ hơn trong công thức.
Nếu bạn muốn sử dụng thông số môi trường và các tiện ích khác như nhật ký, bạn có thể sử dụng gulp-produc
/*
$npm install gulp-util --save-dev
$gulp --varName 123
*/
var util = require('gulp-util');
util.log(util.env.varName);
gulp-produc hiện không được dùng nữa. Bạn có thể sử dụng tối giản thay thế.
var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
Câu trả lời của @ Ethan sẽ hoàn toàn hoạt động. Từ kinh nghiệm của tôi, cách nút nhiều hơn là sử dụng các biến môi trường. Đó là một cách tiêu chuẩn để định cấu hình các chương trình được triển khai trên nền tảng lưu trữ (ví dụ Heroku hoặc Dokku).
Để truyền tham số từ dòng lệnh, hãy làm như sau:
Phát triển:
gulp dev
Sản xuất:
NODE_ENV=production gulp dev
Cú pháp khác nhau, nhưng rất Unix và tương thích với Heroku, Dokku, v.v.
Bạn có thể truy cập vào biến trong mã của bạn tại process.env.NODE_ENV
MYAPP=something_else gulp dev
sẽ thiết lập
process.env.MYAPP === 'something_else'
Câu trả lời này có thể cung cấp cho bạn một số ý tưởng khác.
Đây là mẫu của tôi làm thế nào tôi sử dụng nó. Đối với nhiệm vụ css / ít hơn. Có thể áp dụng cho tất cả.
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);
});
Đây là một cách khác mà không cần thêm mô-đun:
Tôi cần đoán môi trường từ tên tác vụ, tôi có nhiệm vụ 'dev' và nhiệm vụ 'prod'.
Khi tôi chạy gulp prod
nó nên được đặt thành môi trường prod. Khi tôi chạy gulp dev
hoặc bất cứ điều gì khác, nó nên được đặt thành môi trường dev.
Cho rằng tôi chỉ cần kiểm tra tên tác vụ đang chạy:
devEnv = process.argv[process.argv.length-1] !== 'prod';
Nếu bạn sử dụng gulp với yargs, hãy chú ý những điều sau:
Nếu bạn có một nhiệm vụ 'khách hàng' và sẽ không sử dụng bản dựng yargs trong Kiểm tra tham số cho các lệnh được yêu cầu:
.command("customer <place> [language]","Create a customer directory")
gọi nó bằng:
gulp customer --customer Bob --place Chicago --language english
yargs sẽ luôn đưa ra một lỗi, rằng không có đủ lệnh được gán cho cuộc gọi, ngay cả khi bạn có !! -
Hãy thử và chỉ thêm một chữ số vào lệnh (để làm cho nó không bằng tên tác vụ gulp) ... và nó sẽ hoạt động:
.command("customer1 <place> [language]","Create a customer directory")
Đây là nguyên nhân khiến gulp dường như kích hoạt tác vụ, trước khi yargs có thể kiểm tra Thông số bắt buộc này. Tôi mất nhiều giờ để tìm ra điều này.
Hy vọng điều này sẽ giúp bạn ..
Tôi biết tôi đến trễ để trả lời câu hỏi này nhưng tôi muốn thêm câu trả lời của @Ethan, câu trả lời được bình chọn và chấp nhận cao nhất.
Chúng ta có thể sử dụng yargs
để lấy tham số dòng lệnh và cùng với đó, chúng ta cũng có thể thêm bí danh của riêng mình cho một số tham số như sau.
var args = require('yargs')
.alias('r', 'release')
.alias('d', 'develop')
.default('release', false)
.argv;
Vui lòng tham khảo liên kết này để biết thêm chi tiết. https://github.com/yargs/yargs/blob/HEAD/docs/api.md
Sau đây là sử dụng bí danh theo tài liệu của yargs
. Chúng ta cũng có thể tìm thấy nhiều yargs
chức năng hơn ở đó và có thể làm cho trải nghiệm dòng lệnh tốt hơn.
.alias (khóa, bí danh)
Đặt tên khóa là tương đương sao cho các cập nhật thành khóa sẽ truyền tới bí danh và ngược lại.
Tùy chọn .alias () có thể lấy một đối tượng ánh xạ các khóa thành bí danh. Mỗi khóa của đối tượng này phải là phiên bản chính tắc của tùy chọn và mỗi giá trị phải là một chuỗi hoặc một chuỗi các chuỗi.
Chỉ cần tải nó vào một đối tượng mới trong quá trình .. process.gulp = {}
và có nhiệm vụ nhìn vào đó.