2016-08-01 68 views
1

我正在構建一個CLI工具來開始學習一些Go。我發現這種流行的包,我想使用一些像這樣的命令:瞭解帶標誌的子命令

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 

我的理解是ex將是我的主要命令的方式。
listauthenticate是子命令。

但什麼是在這種情況下todosevents?那麼--completed會是什麼。是--completed叫做Option?這是我看到的神祕人,但不知道我是否正確閱讀。我試圖找到一個具有不同選項的示例,例如此場景,但我找不到一個。我嘗試使用urfave/cli,它首先運行良好,直到我找到一個要求能夠將多個實體傳遞到ex list,如ex list todos events。提前致謝!

回答

1

我已經在多個項目上使用jessevdk/go-flags,並且非常喜歡它。文檔很少,但代碼很乾淨,所以在很多方面都是自我記錄。

我會盡量解決您的問題,盡我所能:

ex將是你的二進制文件,通常是所有頂級命令的「主」結構(如https://github.com/concourse/fly/blob/master/commands/fly.go)。這將在你的主函數中被解析(例如https://github.com/concourse/fly/blob/master/main.go)。

todosevents居然會被子的第一級。您可以使用您在'master'命令結構中定義命令的相同方式在第一級命令(list)上定義這些命令。

--completed的確是一種選擇。使用去-旗幟在廣場CI CLI https://github.com/concourse/fly一個開源項目的

一個例子。雖然它不像你想要的那樣嵌套命令,但它爲go-flags的使用提供了堅實的基礎。

+0

在50行的fly.go底部,有'var Fly FlyCommand'。爲什麼這需要?如果沒有第50行的聲明,你能不能引用另一個包中的FlyCommand? – Crystal

+1

是的,那就是創建一個'FlyCommand'結構的實例,以便它可以填充值。你會在'main()'函數中看到該變量的地址被傳遞給'NewParser()'中的解析器。然後,當調用Parse()時,go-flags通過命令/選項結構填充適當的字段。 – Corbin

0

如果您正在嘗試學習Go,請不要使用外部軟件包,請使用核心庫,例如標誌。