Pass Parameter ke Gulp Task

194

Biasanya kita dapat menjalankan tugas tegukan dari konsol melalui sesuatu seperti gulp mytask. Apakah ada cara lain yang dapat saya berikan pada parameter untuk menelan tugas? Jika memungkinkan, tolong tunjukkan contoh bagaimana hal itu dapat dilakukan.

pengguna1995781
sumber

Jawaban:

269

Ini adalah fitur program yang tidak dapat bertahan tanpa. Anda dapat mencoba yarg .

npm install --save-dev yargs

Anda bisa menggunakannya seperti ini:

gulp mytask --production --test 1234

Dalam kode, misalnya:

var argv = require('yargs').argv;
var isProduction = (argv.production === undefined) ? false : true;

Untuk pengertian Anda:

> 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

Semoga Anda bisa mengambilnya dari sini.

Ada plugin lain yang bisa Anda gunakan, minimalis. Ada pos lain di mana ada contoh yang bagus untuk yarg dan minimalis: ( Apakah mungkin untuk mengirimkan bendera kepada Gulp agar menjalankan tugas dengan cara yang berbeda? )

Ethan
sumber
13
Jawaban yang ditulis dengan sangat baik, terima kasih untuk contohnya!
Allen Rice
bagaimana cara mengakses ini di javascript?
vini
Jika Anda menggunakan gulp dengan yargs, perhatikan hal berikut: Jika Anda memiliki tugas 'pelanggan' dan tidak ingin menggunakan build yarg di Parameter memeriksa perintah yang diperlukan: perintah ("pelanggan", "Buat direktori pelanggan")
suther
Lihat komentar saya di bawah ini, jika Anda ingin menggunakan yargs yang dibangun di parameter periksa untuk diperlukan 'perintah' bersama dengan
gulp
5
(argv.production === undefined) ? false : true;setara dengan argv.production !== undefined.
CJStuart
136

Jika Anda ingin menghindari menambahkan dependensi tambahan, saya menemukan simpul process.argvberguna:

gulp.task('mytask', function() {
    console.log(process.argv);
});

Jadi yang berikut ini:

gulp mytask --option 123

harus menampilkan:

[ 'node', 'path/to/gulp.js', 'mytask', '--option', '123']

Jika Anda yakin bahwa parameter yang diinginkan ada di posisi yang tepat, maka flag tidak diperlukan. ** Cukup gunakan (dalam hal ini):

var option = process.argv[4]; //set to '123'

TETAPI: karena pilihannya mungkin tidak ditetapkan, atau mungkin berada di posisi yang berbeda, saya merasa bahwa ide yang lebih baik adalah sesuatu seperti:

var option, i = process.argv.indexOf("--option");
if(i>-1) {
    option = process.argv[i+1];
}

Dengan begitu, Anda dapat menangani variasi dalam banyak opsi, seperti:

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

Edit ** : benar untuk skrip simpul, tetapi tegukan menafsirkan apa pun tanpa "-" pengarah sebagai nama tugas lain. Jadi menggunakan gulp mytask 123akan gagal karena tegukan tidak dapat menemukan tugas yang disebut '123'.

Trevedhek
sumber
1
Ada kesalahan ketik dalam "opsi var, i = proses, argv.indexOf (" - option ");". Saya percaya itu harus menjadi proscess.argv.
Luis Paulo Lohmann
Ah, seharusnya begitu. Dikoreksi. Terima kasih @luis
Trevedhek
Saya hanya ingin memeriksa flag --dev, jadi saya bisa membedakan antara produksi dan lingkungan yang lebih rendah. Ini melakukan trik tanpa menambahkan dependensi tambahan. Terima kasih!
B01
1
Bagi saya, gulp myTask --productionhasil process.argvsama dengan[pathToNode, pathToGulp, 'myTask', '--production']
Sung Cho
2
Mungkin telah berubah, saya telah melihat beberapa contoh lama dengan perbedaan yang sama. Bagaimanapun, Anda bisa men-debug itu dan melihat untuk kasus Anda. Ini harus menjadi jawaban yang diterima karena tidak memiliki dependensi ..
Juan
19

Melewati parameter ke tegukan dapat berarti beberapa hal:

  • Dari baris perintah ke gulpfile (sudah dicontohkan di sini).
  • Dari badan utama skrip gulpfile.js ke tugas menelan.
  • Dari satu tugas menelan ke tugas menelan yang lain.

Berikut adalah pendekatan melewatkan parameter dari tegukan utama ke tugas tegukan. Dengan memindahkan tugas yang membutuhkan parameter ke modulnya sendiri dan membungkusnya dalam suatu fungsi (agar suatu parameter dapat dilewati) .:

// ./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});

Ini bisa berguna jika Anda memiliki banyak tugas menelan dan ingin memberikan mereka beberapa konfigurasi lingkungan yang berguna. Saya tidak yakin apakah itu bisa berfungsi antara satu tugas dan lainnya.

yuvilio
sumber
16

Ada resep tegukan resmi untuk ini menggunakan minimalis .

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

Dasar-dasar menggunakan minimalis untuk memisahkan argumen cli dan menggabungkannya dengan opsi yang diketahui:

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

Yang akan mem-parsing sesuatu seperti

$ gulp scripts --env development

Info lebih lengkap dalam resep.

RobW
sumber
1
Mengapa sampah di bagian atas daftar dan solusi yang tepat di bagian bawah tidak terangkat? desah
DDD
14

Jika Anda ingin menggunakan params lingkungan dan utilitas lain seperti log, Anda dapat menggunakan gulp-util

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

Memperbarui

gulp-util sekarang sudah tidak digunakan lagi. Anda bisa menggunakan minimalis .

var argv = require('minimist')(process.argv.slice(2));
console.dir(argv);
Quy Tang
sumber
1
gulp-util sudah tidak digunakan lagi sejak 2016
valdeci
5

Jawaban @ Ethan akan sepenuhnya bekerja. Dari pengalaman saya, cara simpul lebih banyak menggunakan variabel lingkungan. Ini adalah cara standar untuk mengkonfigurasi program yang digunakan pada platform hosting (mis. Heroku atau Dokku).

Untuk melewatkan parameter dari baris perintah, lakukan seperti ini:

Pengembangan: gulp dev

Produksi: NODE_ENV=production gulp dev

Sintaksnya berbeda, tetapi sangat Unix, dan itu kompatibel dengan Heroku, Dokku, dll.

Anda dapat mengakses variabel dalam kode Anda di process.env.NODE_ENV

MYAPP=something_else gulp dev

akan ditetapkan

process.env.MYAPP === 'something_else'

Jawaban ini mungkin memberi Anda beberapa ide lain.

Michael Cole
sumber
4

Ini contoh saya bagaimana saya menggunakannya. Untuk tugas css / kurang. Dapat diaplikasikan untuk semua.

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);
});
Lynx
sumber
3

Berikut cara lain tanpa modul tambahan:

Saya perlu menebak lingkungan dari nama tugas, saya punya tugas 'dev' dan tugas 'prod'.

Ketika saya menjalankannya gulp prodharus diatur ke lingkungan prod. Ketika saya menjalankan gulp devatau apa pun itu harus diatur ke lingkungan dev.

Untuk itu saya baru memeriksa nama tugas yang berjalan:

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

Jika Anda menggunakan tegukan dengan yarg, perhatikan hal berikut:

Jika Anda memiliki tugas 'pelanggan' dan tidak ingin menggunakan yarg, build di Parameter memeriksa perintah yang diperlukan:

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

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

yargs akan selalu melemparkan kesalahan, bahwa tidak ada cukup perintah yang ditugaskan untuk panggilan, bahkan jika Anda punya !! -

Cobalah dan tambahkan hanya satu digit ke perintah (untuk membuatnya tidak sama dengan nama tugas gulp) ... dan itu akan bekerja:

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

Ini disebabkan oleh tegukan yang tampaknya memicu tugas, sebelum yarg dapat memeriksa Parameter yang diperlukan ini. Butuh waktu beberapa jam untuk mencari tahu hal ini.

Semoga ini bisa membantu Anda ..

suther
sumber
0

Saya tahu saya terlambat untuk menjawab pertanyaan ini, tetapi saya ingin menambahkan sesuatu ke jawaban @Ethan, jawaban tertinggi yang diterima dan diterima.

Kita bisa menggunakan yargs untuk mendapatkan parameter baris perintah dan dengan itu kita juga dapat menambahkan alias kita sendiri untuk beberapa parameter seperti follow.

var args = require('yargs')
    .alias('r', 'release')
    .alias('d', 'develop')
    .default('release', false)
    .argv;

Silakan merujuk tautan ini untuk detail lebih lanjut. https://github.com/yargs/yargs/blob/HEAD/docs/api.md

Berikut ini adalah penggunaan alias sesuai yang diberikan dalam dokumentasi yargs. Kami juga dapat menemukan lebih banyakyargs fungsi di sana dan dapat membuat pengalaman melewati baris perintah lebih baik.

.alias (kunci, alias)

Tetapkan nama kunci sebagai setara sehingga pembaruan ke kunci akan disebarkan ke alias dan sebaliknya.

Opsional .alias () dapat mengambil objek yang memetakan kunci ke alias. Setiap kunci objek ini harus merupakan versi kanonik dari opsi, dan setiap nilai harus berupa string atau larik string.

Spark Kode
sumber
-2

Hanya memuatnya ke objek baru pada proses .. process.gulp = {}dan minta tugas melihat di sana.

Kirk Strobeck
sumber