web-dev-qa-db-ja.com

Gulpタスクにパラメータを渡す

通常、コンソールからgulp mytaskのようなものを介してgulpタスクを実行できます。私はgulpタスクにパラメータを渡すことができるとにかくありますか?可能であれば、どのようにそれができるかの例を示してください。

168
user1995781

それはプログラムがなくてはいけない機能です。あなたは糸を試すことができます。

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

あなたがここからそれを取ることができると思います。

あなたが使用できる別のプラグインがあります、ミニマリスト。引数とミニマリストの両方に良い例がある別の投稿があります。( Gulpにタスクをさまざまな方法で実行させるためのフラグを渡すことは可能ですか?

243
Ethan

追加の依存関係を追加したくない場合は、ノードの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は先頭に " - "が付いていないものを別のタスク名として解釈します。そのため、gulpが '123'という名前のタスクを見つけることができないため、gulp mytask 123の使用は失敗します

125
Trevedhek

パラメータをgulpに渡すことは、いくつかのことを意味します。

  • コマンドラインからgulpfileへ(すでにここで例示されています)。
  • Gulpfile.jsスクリプトの本体からgulpタスクまで。
  • あるグループタスクから別のグループタスクへ。

これは、メイン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});

あなたがたくさんのgulpタスクを持っていて、それらにいくつかの便利な環境設定を渡したいなら、これは役に立ちます。あるタスクと別のタスクの間でうまく機能できるかどうかはわかりません。

17
yuvilio

ミニマリスト を使用した公式のガルプレシピがあります。

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

基本は、cli引数を分離してそれらを既知のオプションと組み合わせるためにミニマリストを使用することです。

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

これは次のようになります。

$ gulp scripts --env development

レシピにもっと詳しい情報があります。

14
RobW

Logなどの環境パラメータや他のユーティリティを使用する場合は、 gulp-util を使用できます。

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

@イーサンの答えは完全にうまくいくでしょう。私の経験上、もっとノード的な方法は環境変数を使うことです。ホスティングプラットフォーム(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'

この答え はあなたに他の考えを与えるかもしれません。

5
Michael Cole

これが私の使い方のサンプルです。 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);
});
4
Lynx

これは追加のモジュールなしで別の方法です:

タスク名から環境を推測する必要があり、 'dev'タスクと 'prod'タスクがあります。

gulp prodを実行するときは、prod環境に設定する必要があります。 gulp devなどを実行するときは、dev environmentに設定する必要があります。

そのためには、実行中のタスク名を確認するだけです。

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

gulpをyargsと一緒に使用すると、に注意してください。

タスク「customer」があり、yargsを使用したくない場合は、必須コマンドのパラメータチェックを行います。

.command("customer <place> [language]","Create a customer directory")は以下のように呼び出します。

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

たとえあなたが持っていたとしても、yargsは常にエラーを投げます。コールに割り当てられたコマンドが足りません。 -

試してみて、コマンドに数字だけを追加します(gulp-task名と同じにならないようにします)。

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

これは、garpがタスクをトリガーするように思われる原因です。その前に、yargsはこの必須パラメーターをチェックすることができます。これを理解するには何時間もかかりました。

これがあなたのお役に立てば幸いです。

1
suther

私はこの質問に答えるのが遅れていることを知っています、しかし私は@Ethan、最も高い投票と受け入れられた答えの答えに何かを加えたいです。

yargsを使用してコマンドラインパラメータを取得することができます。それに伴い、followなどの一部のパラメータに独自のエイリアスを追加することもできます。

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のドキュメントで与えられている通りのaliasの使用です。また、yargs関数をもっと見つけることができ、コマンドラインの受け渡しをさらに良くすることができます。

.alias(キー、エイリアス)

キーへの更新がエイリアスにも伝播し、その逆も同様になるように、キー名を同等のものとして設定します。

オプションで.alias()は、キーをエイリアスにマッピングするオブジェクトを受け取ることができます。このオブジェクトの各キーはオプションの正規バージョンであるべきです、そして、各値は文字列か文字列の配列であるべきです。

0
Code Spark