Ich stosse meinen Kopf gegen eine Wand, um Knoten commander
Modul zu bekommen Argumente zu parsen, wie ich will.Node.js Commander mit optionalen + variadic Argumente
Ich möchte eine Liste von Dateien in eine benannte Datenbank hochladen. Es gibt einen Standarddatenbanknamen, so dass der Benutzer nicht benötigen sollte, um einen Datenbankparameter aufzunehmen.
ich diesen Befehl möchte wie folgt arbeiten:
>>> ./upload.js --db ReallyCoolDB /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to database "ReallyCoolDB")
>>> ./upload.js /files/uploadMe1.txt /files/uploadMe2.txt
(uploads "uploadMe1.txt" and "uploadMe2.txt" to the default database)
>>> ./upload.js --db ReallyCoolDB
(returns an error; no files provided)
Wie kann ich das umsetzen mit commander
? Ich habe bereits eine Reihe von Dingen versucht, zur Zeit ich mit diesem Code bin stecken, die nicht funktioniert:
// upload.js:
#!/usr/bin/env node
var program = require('commander');
program
.version('0.1.0')
.description('Upload files to a database')
.command('<path1> [morePaths...]')
.option('-d, --db [dbName]', 'Optional name of db', null)
.action(function(path1, morePaths) {
// At this point I simply want:
// 1) a String "dbName" var
// 2) an Array "paths" containing all the paths the user provided
var dbName = program.db || getDefaultDBName();
var paths = [ path1 ].concat(morePaths || []);
console.log(dbName, paths);
// ... do the upload ...
})
.parse(process.argv);
Wenn ich versuche ./upload.js
zu laufen, bekomme ich keine Ausgabe!
Wie kann ich Commander verwenden, um einen einzelnen optionalen Parameter und eine nicht leere Liste von Zeichenfolgen zu akzeptieren?
EDIT: Dank Rob Raischs Antwort habe ich mein Problem gelöst! Die Lösung ist usage
anstelle von action
zu verwenden, macht alle Arbeiten nach den program
Befehlen (statt innerhalb einer action
-Funktion), die Arbeit mit program.db
und program.args
und manuell sicherzustellen, dass program.args
nicht leer ist:
var program = require('commander');
program
.version('0.1.0')
.description('Upload files to a database')
.usage('[options] <path1> [morePaths ...]') // This improves "--help" output
.option('-d, --db [dbName]', 'Optional name of db', null)
.parse(process.argv);
var dbName = program.db || getDefaultDBName();
var paths = program.args;
if (!paths.length) {
console.log('Need to provide at least one path.');
process.exit(1);
}
// Do the upload!
Also, was ist der richtige Weg, um einen optionalen Parameter + eine nicht leere Liste mit 'commander' zu akzeptieren? Sollte ich Commander verwenden, um den optionalen Parameter zu analysieren und dann 'program.args' manuell zu parsen? –
Dank dieser Antwort habe ich es herausgefunden! –