本文目錄一覽:
003-golang 調用外部命令
003-golang 調用外部命令
相關函數
exec包執行外部命令,它將os.StartProcess進行包裝使得它更容易映射到stdin和stdout,並且利用pipe連接i/o.
func LookPath(file string) (string, error) //LookPath在環境變數中查找科執行二進位文件,如果file中包含一個斜杠,則直接根據絕對路徑或者相對本目錄的相對路徑去查找
在用exec包調用的其他進程後如何關閉結束,可以使用context包的機制進行管理,context包的使用詳見:
exec.CommandContext方發實現了context,通過context可以對exec啟動的進程結束。
隱藏程序自身黑窗口的方法:go build -ldflags=”-H windows”
隱藏子進程黑窗口的方法:
golang命令行庫Cobra的使用
寫了2次才寫完,內容很長,翻譯了很久,內容來源於Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當強大完善,各種使用的場景都考慮到了。另外也擴展了一些其它知識,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
Cobra提供簡單的介面來創建強大的現代化CLI介面,比如git與go工具。Cobra同時也是一個程序, 用於創建CLI程序
Cobra是建立在結構的命令、參數和標誌之上。
命令代表操作,參數和標誌是這些行動的修飾符。
最好的應用程序就像讀取句子。用戶會知道如何使用本機應用程序,因為他們將理解如何使用它。
比如下面的例子, server 是命令, port 是標誌:
在下面的命令,我們告訴Git克隆url地址bare
使用Cobra很簡單。首先,使用 go get 安裝最新版本
然後在你項目里引用Cobra
通常基於Cobra的應用程序將遵循下面的組織結構,當然你也可以遵循自己的介面:
在Cobra應用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序來創建你的程序並且添加你想要的命令。這是最簡單的方式把Cobra添加到你的程序里。
這裡 你能找到相關信息
使用Cobra,需要創建一個空的main.go文件和一個rootCmd文件。你可以選擇在合適的地方添加額外的命令。
Cobra不需要特殊的構造函數。簡單的就可以創建你的命令。
理想情況下你把這個放在在 app/cmd/root.go
你會另外定義標誌和處理配置init()函數。
比如 cmd/root.go
你需要在main函數里執行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定義在cmd/目錄下的自己文件內
如果你想創建一個version命令,你可以創建cmd/version.go文件,並在文件里這麼寫:
標誌提供修飾符控制動作命令如何操作
當標誌定義好了,我們需要定義一個變數來關聯標誌
‘持久’表示每個在那個命令下的命令都將能分配到這個標誌。對於全局標誌,’持久’的標誌綁定在root上。
Cobra默認只在目標命令上解析標誌,父命令忽略任何局部標誌。通過打開 Command.TraverseChildren Cobra將會在執行任意目標命令前解析標誌
你同樣可以通過 viper 綁定標誌:
在這個例子中,永久的標記 author 被 viper 綁定, 注意 , 當用戶沒有給 –author 提供值, author 不會被賦值。
標記默認是可選的,如果你希望當一個標記沒有設置時,命令行報錯,你可以標記它為必須的
驗證位置參數可以通過 Command 的 Args 欄位。
內置下列驗證方法
一個設置自定義驗證的例子
在下面的例子,我們定義了3個命令。2個在頂級,一個(cmdTimes)是其中一個頂級命令的子命令。在這個例子里,由於沒有給 rootCmd 提供 Run ,單獨的root是不能運行的,必須要有子命令。
我們僅為一個命令定義了標記。
更多關於flags的文檔可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
當你的程序有子命令時,Cobra 會自動給你程序添加help命令。當你運行『app help』,會調用help命令。另外,help同樣支持其它輸入命令。例如,你有一個沒有任何其它配置的命令叫『create』,當你調用『app help create』 Corbra 將會起作用。
下面的輸入是 Cobra 自動生成的。除了命令和標誌的定義,其它不再需要。
help 就跟其它命令一樣,並沒有特殊的邏輯或行為。事實上,你也可以提供你自己help如果你想的話。
你能為默認的命令,提供你自己的help命令或模板。使用下面的方法:
後2個也將適用於任何子命令
當用戶提供無效的標記或命令,Cobra 將會返回 用法 。
你可能從上面的幫助意識到,默認的幫助將被嵌入到用法里然後作為輸出。
你能提供你自己的用法函數或模板給 Cobra 使用。
比如幫助,方法和模板都可以重寫。
如果Version欄位設置到了根命令,Cobra 會提供了一個頂層 『–version』標記。運行帶上『–version』標記的程序,將會按照模板版本信息。模板可以通過 cmd.SetVersionTemplate(s string) 方法修改
在命令運行前或運行後,再運行方法非常容易。 PersistentPreRun 和 PreRun 方法將會在 Run 之前執行。 PersistentPostRun 和 PostRun 方法將會在 Run 之後執行。 Persistent*Run 方法會被子命令繼承,如果它們自己沒有定義的話。這些方法將按照下面的屬性執行:
下面的例子,2個命令都使用了上面的特性。當子命令執行的時候,它將執行根命令的 PersistentPreRun ,但不會執行根命令的 PersistentPostRun :
輸出:
Cobra 會自動輸出建議,當遇到「unknown command」錯誤時。這使得當輸入錯誤時, Cobra 的行為類似 git 命令。例如:
建議會基於註冊的子命令自動生成。使用了 Levenshtein distance 的實現。每一個註冊的命令會匹配2個距離(忽略大小寫)來提供建議。
如果你希望在你的命令里,禁用建議或虛弱字元串的距離,使用:
或
你可以通過 SuggestFor 來給命令提供明確的名詞建議。這個特性允許當字元串不相近,但是意思與你的命令相近,別切你也不想給該命令設置別名。比如:
Cobra 可以基於子命令,標記,等生成文檔。以以下格式:
Cobra 可以生成一個bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強大和靈活。更多介紹在 Bash Completions 。
golang的build命令
下面命令會生成一個可執行文件realtime-chat
查看go build使用
The -o flag, only allowed when compiling a single package,
forces build to write the resulting executable or object
to the named output file, instead of the default behavior described
in the last two paragraphs.
原創文章,作者:ABEK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/137401.html