Truyền tham số cho nhiệm vụ Gulp


194

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:


269

Đâ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? )


13
Câu trả lời thực sự tốt bằng văn bản, cảm ơn cho các ví dụ!
Allen Rice

Làm thế nào để một người truy cập này trong javascript?
vini

Nếu bạn sử dụng gulp với yargs, hãy lưu ý 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 yargs build trong Kiểm tra tham số cho các lệnh bắt buộc: lệnh ("khách hàng", "Tạo thư mục khách hàng")
suther

Xem nhận xét của tôi bên dưới, nếu bạn muốn sử dụng các yargs được tích hợp trong kiểm tra tham số cho các 'lệnh' bắt buộc cùng với gulp: stackoverflow.com/a/41412558/1256697
suther

5
(argv.production === undefined) ? false : true;tương đương với argv.production !== undefined.
CJStuart

136

Nếu bạn muốn tránh thêm phụ thuộc, tôi thấy nút process.argvlà 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 123sẽ thất bại vì gulp không thể tìm thấy một nhiệm vụ gọi là '123'.


1
Có một lỗi đánh máy trong "tùy chọn var, i = process, argv.indexOf (" - tùy chọn ");". Tôi tin rằng nó nên được Proccess.argv.
Luis Paulo Lohmann

Ah, vậy nó nên. Đã sửa. Cảm ơn @luis
Trevedhek

Tôi chỉ muốn kiểm tra cờ --dev, vì vậy tôi có thể phân biệt giữa sản xuất và môi trường thấp hơn. Đây không phải là mẹo mà không cần thêm phụ thuộc. Cảm tạ!
b01

1
Đối với tôi, gulp myTask --productionkết quả process.argvtương đương với[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho

2
Có lẽ nó đã thay đổi, tôi đã thấy một số ví dụ cũ có cùng sự khác biệt. Dù sao, bạn chỉ có thể gỡ lỗi nó và xem cho trường hợp của bạn. Đây phải là câu trả lời được chấp nhận vì nó không phụ thuộc ..
Juan

19

Truyền tham số cho gulp có thể có nghĩa là một vài điều:

  • Từ dòng lệnh đến gulpfile (đã được minh họa ở đây).
  • Từ phần chính của tập lệnh gulpfile.js đến các tác vụ gulp.
  • Từ một nhiệm vụ một ngụm đến một nhiệm vụ khác.

Đâ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.


16

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.


1
Tại sao rác ở đầu danh sách và giải pháp thích hợp ở phía dưới không được nâng cấp? thở dài
DDD

14

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);

Cập nhật

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);

1
gulp-
produc

5

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.


4

Đâ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);
});

3

Đâ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 prodnó nên được đặt thành môi trường prod. Khi tôi chạy gulp devhoặ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';

2

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 ..


0

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 yargschứ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.


-2

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 đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.