webentwicklung-frage-antwort-db.com.de

Parameter an Gulp-Task übergeben

Normalerweise können wir gulp task von der Konsole aus mit etwas wie gulp mytask Ausführen. Gibt es sowieso, dass ich Parameter an Schluckaufgabe übergeben kann? Wenn möglich, zeigen Sie bitte ein Beispiel, wie es gemacht werden kann.

172
user1995781

Es ist ein Feature, auf das Programme nicht verzichten können. Sie können yargs versuchen.

npm install --save-dev yargs

Du kannst es so benutzen:

gulp mytask --production --test 1234

Im Code zum Beispiel:

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

Für dein Verständnis:

> 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

Hoffe, Sie können es von hier aus nehmen.

Es gibt ein weiteres Plugin, das Sie verwenden können, Minimist. Es gibt einen anderen Beitrag, in dem es gute Beispiele für Yargs und Minimisten gibt: Ist es möglich, eine Flagge an Gulp zu übergeben, damit dieser Aufgaben auf verschiedene Arten ausführt? )

247
Ethan

Wenn Sie vermeiden möchten, zusätzliche Abhängigkeiten hinzuzufügen, empfand ich den process.argv Des Knotens als nützlich:

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

Also folgendes:

gulp mytask --option 123

sollte anzeigen:

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

Wenn Sie sicher sind, dass sich der gewünschte Parameter an der richtigen Position befindet, werden die Flags nicht benötigt. ** Verwenden Sie einfach (in diesem Fall):

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

ABER: Da die Option möglicherweise nicht festgelegt ist oder sich in einer anderen Position befindet, denke ich, dass eine bessere Idee in etwa wie folgt aussehen würde:

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

Auf diese Weise können Sie Variationen in mehreren Optionen handhaben, z.

//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: true für Knotenskripte, aber gulp interpretiert alles ohne führendes "-" als anderen Aufgabennamen. Daher schlägt die Verwendung von gulp mytask 123 Fehl, da gulp keine Aufgabe mit dem Namen '123' finden kann '.

126
Trevedhek

Die Übergabe eines Parameters an gulp kann einige Dinge bedeuten:

  • Von der Kommandozeile bis zur Gulpfile (hier bereits exemplarisch dargestellt).
  • Vom Hauptteil des Skripts "gulpfile.js" bis zu den Aufgaben "gulp".
  • Von einer Schluckaufgabe zu einer anderen Schluckaufgabe.

Hier ist ein Ansatz zum Übergeben von Parametern von der Haupt-Gulpfile an eine Gulp-Aufgabe. Verschieben Sie die Aufgabe, für die der Parameter benötigt wird, in ein eigenes Modul und fügen Sie sie in eine Funktion ein (sodass ein Parameter übergeben werden kann):

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

Dies kann nützlich sein, wenn Sie viele Schluckaufgaben haben und ihnen einige nützliche Umgebungskonfigurationen übergeben möchten. Ich bin nicht sicher, ob es zwischen einer Aufgabe und einer anderen funktionieren kann.

18
yuvilio

Hierfür gibt es ein offizielles Rezept mit Minimist .

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

In den Grundlagen werden die CLI-Argumente mithilfe von Minimist getrennt und mit bekannten Optionen kombiniert:

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

Welches würde so etwas wie analysieren

$ gulp scripts --env development

Weitere Infos im Rezept.

14
RobW

Wenn Sie Umgebungsparameter und andere Hilfsprogramme wie log verwenden möchten, können Sie gulp-util verwenden

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

@Ethans Antwort würde voll und ganz funktionieren. Aus meiner Erfahrung ist die Verwendung von Umgebungsvariablen die Methode mit den meisten Knoten. Dies ist eine Standardmethode zum Konfigurieren von Programmen, die auf Hostingplattformen (z. B. Heroku oder Dokku) bereitgestellt werden.

So übergeben Sie den Parameter über die Befehlszeile:

Entwicklung: gulp dev

Produktion: NODE_ENV=production gulp dev

Die Syntax ist anders, aber sehr unixkompatibel mit Heroku, Dokku usw.

Sie können auf die Variable in Ihrem Code unter process.env.NODE_ENV Zugreifen.

MYAPP=something_else gulp dev

würde setzen

process.env.MYAPP === 'something_else'

Diese Antwort könnte Ihnen einige andere Ideen geben.

5
Michael Cole

Hier ist mein Beispiel, wie ich es benutze. Für die CSS/Less-Aufgabe. Kann für alle angewendet werden.

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

Hier ist ein anderer Weg ohne zusätzliche Module:

Ich musste die Umgebung anhand des Aufgabennamens erraten, ich habe eine 'Entwickler'-Aufgabe und eine' Produkt'-Aufgabe.

Wenn ich gulp prod sollte auf Prod-Umgebung eingestellt sein. Wenn ich gulp dev oder irgendetwas anderes sollte auf dev environment gesetzt werden.

Dazu überprüfe ich nur den Namen der ausgeführten Aufgabe:

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

Wenn Sie mit yargs schlucken verwenden, beachten Sie Folgendes:

Wenn Sie eine Aufgabe "Kunde" haben und yargs nicht verwenden möchten, bauen Sie die Parameterprüfung für die erforderlichen Befehle ein:

.command("customer <place> [language]","Create a customer directory") rufe es auf mit:

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

yargs wird immer einen Fehler auslösen, dass dem Aufruf nicht genügend Befehle zugewiesen wurden, auch wenn Sie !! -

Probieren Sie es aus und fügen Sie dem Befehl nur eine Ziffer hinzu (damit er nicht dem Namen der Schluckaufgabe entspricht) ... und es wird funktionieren:

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

Dies ist der Grund, warum Schlucke die Aufgabe auszulösen scheinen, bevor yargs in der Lage ist, nach diesem erforderlichen Parameter zu suchen. Es hat mich mehrere Stunden gekostet, das herauszufinden.

Hoffe das hilft dir ..

1
suther

Ich weiß, dass ich zu spät komme, um diese Frage zu beantworten, aber ich möchte etwas hinzufügen, um @Ethan, die am höchsten bewertete und akzeptierte Antwort, zu beantworten.

Wir können yargs verwenden, um den Befehlszeilenparameter abzurufen und damit auch unseren eigenen Alias ​​für einige Parameter wie folgt hinzufügen.

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

Bitte verweisen Sie auf diesen Link für weitere Details. https://github.com/yargs/yargs/blob/HEAD/docs/api.md

Im Folgenden wird der in der Dokumentation von yargs angegebene Alias ​​verwendet. Dort finden wir auch mehr yargs -Funktionen und können die Befehlszeilenübergabe noch verbessern.

.alias (Schlüssel, Alias)

Legen Sie die Schlüsselnamen als äquivalent fest, sodass Aktualisierungen eines Schlüssels an Aliase weitergegeben werden und umgekehrt.

Optional kann .alias () ein Objekt übernehmen, das Schlüssel zu Aliasen zuordnet. Jeder Schlüssel dieses Objekts sollte die kanonische Version der Option sein, und jeder Wert sollte eine Zeichenfolge oder ein Array von Zeichenfolgen sein.

0
Code Spark