2016-08-01 8 views
1

Ich baue ein CLI-Tool, um etwas Go zu lernen. Ich fand dieses beliebte Paket, das ich für einige Befehle wie diese verwenden wollte:Verstehen von Unterbefehlen mit Go-Flags

http://godoc.org/github.com/jessevdk/go-flags#Group
https://github.com/jessevdk/go-flags

ex list todos 
ex list todos --completed 
ex list events 
ex list todos events 
ex authenticate 

So wie ich es verstehe ex ist, würde mein Haupt-Befehl sein.
list und authenticate sind Unterbefehle.

Aber was sind todos und events in diesem Szenario? Und was wäre --completed sein. Wird --completedOption genannt? Das ist der Abfall, den ich sehe, aber ich bin mir nicht sicher, ob ich es richtig lese. Ich versuche ein Beispiel zu finden, das die verschiedenen Optionen für etwas wie dieses Szenario hat, aber ich konnte keins finden. Ich habe versucht mit Urfave/CLI, die zuerst gut funktionierte, bis ich eine Anforderung gefunden in der Lage sein, mehrere Entitäten an ex list wie ex list todos events übergeben. Danke im Voraus!

Antwort

1

Ich habe jessevdk/go-flags bei mehreren Projekten verwendet und mag es wirklich. Die Dokumentation ist spärlich, aber der Code ist sauber und in vielerlei Hinsicht selbstdokumentierend.

Ich werde versuchen, und richten Sie Ihre Fragen, so gut ich kann:

ex Ihre binär sein würde und in der Regel ein ‚Master‘ struct aller Top-Level-Befehle (zB https://github.com/concourse/fly/blob/master/commands/fly.go). Dies wird in Ihrer Hauptfunktion geparst (zB https://github.com/concourse/fly/blob/master/main.go).

todos und events wäre eigentlich die erste Ebene der Unterbefehle. Sie würden diese auf dem Befehl der ersten Ebene (list) auf die gleiche Weise definieren, wie Sie Befehle auf dem Master-Befehl struct definieren.

--completed ist in der Tat eine Option.

Ein Beispiel für ein Open-Source-Projekt, das Go-Flags im Concourse CI CLI https://github.com/concourse/fly verwendet. Obwohl Sie keine verschachtelten Befehle wie Sie möchten, gibt es eine ziemlich solide Grundlage für die Verwendung von Flags.

+0

Am unteren Rand von fly.go in Zeile 50 befindet sich 'var Fly FlyCommand'. Warum ist das nötig? Können Sie den FlyCommand nicht von einem anderen Paket ohne diese Erklärung in Zeile 50 referenzieren? – Crystal

+1

Ja, das ist, um eine tatsächliche 'Instanz' der 'FlyCommand'-Struktur zu erzeugen, so dass sie mit Werten gefüllt werden kann. Sie werden in der Funktion 'main()' sehen, dass die Adresse dieser Variablen an den Parser in 'NewParser()' übergeben wird. Wenn dann 'Parse()' aufgerufen wird, füllt go-flags entsprechende Felder durch die Befehls-/Optionsstruktur. – Corbin

0

Wenn Sie versuchen, Go zu lernen, verwenden Sie kein externes Paket, verwenden Sie die Kernbibliotheken wie Flag.