寫了2次才寫完,內(nèi)容很長,翻譯了很久,內(nèi)容來源于Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當強大完善,各種使用的場景都考慮到了。另外也擴展了一些其它知識,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
創(chuàng)新互聯(lián)主營黃龍網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,黃龍h5成都小程序開發(fā)搭建,黃龍網(wǎng)站營銷推廣歡迎黃龍等地區(qū)企業(yè)咨詢
Cobra提供簡單的接口來創(chuàng)建強大的現(xiàn)代化CLI接口,比如git與go工具。Cobra同時也是一個程序, 用于創(chuàng)建CLI程序
Cobra是建立在結(jié)構(gòu)的命令、參數(shù)和標志之上。
命令代表操作,參數(shù)和標志是這些行動的修飾符。
最好的應(yīng)用程序就像讀取句子。用戶會知道如何使用本機應(yīng)用程序,因為他們將理解如何使用它。
比如下面的例子, server 是命令, port 是標志:
在下面的命令,我們告訴Git克隆url地址bare
使用Cobra很簡單。首先,使用 go get 安裝最新版本
然后在你項目里引用Cobra
通常基于Cobra的應(yīng)用程序?qū)⒆裱旅娴慕M織結(jié)構(gòu),當然你也可以遵循自己的接口:
在Cobra應(yīng)用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序來創(chuàng)建你的程序并且添加你想要的命令。這是最簡單的方式把Cobra添加到你的程序里。
這里 你能找到相關(guān)信息
使用Cobra,需要創(chuàng)建一個空的main.go文件和一個rootCmd文件。你可以選擇在合適的地方添加額外的命令。
Cobra不需要特殊的構(gòu)造函數(shù)。簡單的就可以創(chuàng)建你的命令。
理想情況下你把這個放在在 app/cmd/root.go
你會另外定義標志和處理配置init()函數(shù)。
比如 cmd/root.go
你需要在main函數(shù)里執(zhí)行root命令。
通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。
其它的命令通常定義在cmd/目錄下的自己文件內(nèi)
如果你想創(chuàng)建一個version命令,你可以創(chuàng)建cmd/version.go文件,并在文件里這么寫:
標志提供修飾符控制動作命令如何操作
當標志定義好了,我們需要定義一個變量來關(guān)聯(lián)標志
'持久'表示每個在那個命令下的命令都將能分配到這個標志。對于全局標志,'持久'的標志綁定在root上。
Cobra默認只在目標命令上解析標志,父命令忽略任何局部標志。通過打開 Command.TraverseChildren Cobra將會在執(zhí)行任意目標命令前解析標志
你同樣可以通過 viper 綁定標志:
在這個例子中,永久的標記 author 被 viper 綁定, 注意 , 當用戶沒有給 --author 提供值, author 不會被賦值。
標記默認是可選的,如果你希望當一個標記沒有設(shè)置時,命令行報錯,你可以標記它為必須的
驗證位置參數(shù)可以通過 Command 的 Args 字段。
內(nèi)置下列驗證方法
一個設(shè)置自定義驗證的例子
在下面的例子,我們定義了3個命令。2個在頂級,一個(cmdTimes)是其中一個頂級命令的子命令。在這個例子里,由于沒有給 rootCmd 提供 Run ,單獨的root是不能運行的,必須要有子命令。
我們僅為一個命令定義了標記。
更多關(guān)于flags的文檔可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
當你的程序有子命令時,Cobra 會自動給你程序添加help命令。當你運行‘a(chǎn)pp help’,會調(diào)用help命令。另外,help同樣支持其它輸入命令。例如,你有一個沒有任何其它配置的命令叫‘create’,當你調(diào)用‘a(chǎn)pp help create’ Corbra 將會起作用。
下面的輸入是 Cobra 自動生成的。除了命令和標志的定義,其它不再需要。
help 就跟其它命令一樣,并沒有特殊的邏輯或行為。事實上,你也可以提供你自己help如果你想的話。
你能為默認的命令,提供你自己的help命令或模板。使用下面的方法:
后2個也將適用于任何子命令
當用戶提供無效的標記或命令,Cobra 將會返回 用法 。
你可能從上面的幫助意識到,默認的幫助將被嵌入到用法里然后作為輸出。
你能提供你自己的用法函數(shù)或模板給 Cobra 使用。
比如幫助,方法和模板都可以重寫。
如果Version字段設(shè)置到了根命令,Cobra 會提供了一個頂層 ‘--version’標記。運行帶上‘--version’標記的程序,將會按照模板版本信息。模板可以通過 cmd.SetVersionTemplate(s string) 方法修改
在命令運行前或運行后,再運行方法非常容易。 PersistentPreRun 和 PreRun 方法將會在 Run 之前執(zhí)行。 PersistentPostRun 和 PostRun 方法將會在 Run 之后執(zhí)行。 Persistent*Run 方法會被子命令繼承,如果它們自己沒有定義的話。這些方法將按照下面的屬性執(zhí)行:
下面的例子,2個命令都使用了上面的特性。當子命令執(zhí)行的時候,它將執(zhí)行根命令的 PersistentPreRun ,但不會執(zhí)行根命令的 PersistentPostRun :
輸出:
Cobra 會自動輸出建議,當遇到“unknown command”錯誤時。這使得當輸入錯誤時, Cobra 的行為類似 git 命令。例如:
建議會基于注冊的子命令自動生成。使用了 Levenshtein distance 的實現(xiàn)。每一個注冊的命令會匹配2個距離(忽略大小寫)來提供建議。
如果你希望在你的命令里,禁用建議或虛弱字符串的距離,使用:
或
你可以通過 SuggestFor 來給命令提供明確的名詞建議。這個特性允許當字符串不相近,但是意思與你的命令相近,別切你也不想給該命令設(shè)置別名。比如:
Cobra 可以基于子命令,標記,等生成文檔。以以下格式:
Cobra 可以生成一個bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強大和靈活。更多介紹在 Bash Completions 。
cobra是一個提供簡單接口來創(chuàng)建強大的現(xiàn)代CLI界面的庫類似git git tools,cobra也是一個應(yīng)用程序,它會生成你的應(yīng)用程序的腳手架來快速開發(fā)基于cobra的應(yīng)用程序
cobra提供:
cobra建立在命令、參數(shù)、標志的結(jié)構(gòu)之上
commands代表動作,args是事物,flags是動作的修飾符
最好的應(yīng)用程序在使用時讀起來就像句子,因此,用戶直觀地知道如何與它們交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標志)
一些真實世界的好例子可以更好地說明這一點
kubectl 命令更能體現(xiàn)APPNAME 動詞 名詞 形容詞
如下的例子,server 是command,port是flag
這個命令中,我們告訴git 克隆url
命令是應(yīng)用程序的中心點,應(yīng)用程序支持的每一個交互都包含在一個命令中,命令可以有子命令,也可以運行操作
在上面的例子中,server是命令
更多關(guān)于cobra.Command
flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標志,也支持go flag package,cobra可以定義到子命令上的標志,也可以僅對該命令可用的標志
在上面的命令中,port是標志
標志的功能由 pflag library 提供,pflag library是flag標準庫的一個分支,在添加POSIX兼容性的同時維護相同的接口。
使用cobra很簡單,首先,使用go get按照最新版本的庫,這個命令會安裝cobra可執(zhí)行程序以及庫和依賴項
下一步,引入cobra到應(yīng)用程序中
雖然歡迎您提供自己的組織,但通常基于Cobra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):
在Cobra應(yīng)用程序中,main.go文件通常非常簡單。它有一個目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用來創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡單的方式
這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息
要手動實現(xiàn)cobra,需要創(chuàng)建一個main.go 和rootCmd文件,可以根據(jù)需要提供其他命令
Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。
理想情況下,您可以將其放在app/cmd/root.go中:
在init()函數(shù)中定義標志和處理配置
例子如下,cmd/root.go:
創(chuàng)建main.go
使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見,Execute應(yīng)該在根目錄下運行,盡管它可以在任何命令上調(diào)用。
在Cobra應(yīng)用程序中,main.go文件通常非常簡單。它有一個目的:初始化Cobra。
可以定義其他命令,通常每個命令在cmd/目錄中都有自己的文件。
如果要創(chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:
如果希望將錯誤返回給命令的調(diào)用者,可以使用RunE。
然后可以在execute函數(shù)調(diào)用中捕獲錯誤。
標志提供修飾符來控制操作命令的操作方式。
由于標志是在不同的位置定義和使用的,因此我們需要在外部定義一個具有正確作用域的變量來分配要使用的標志。
有兩種不同的方法來分配標志。
標志可以是“持久”的,這意味著該標志將可用于分配給它的命令以及該命令下的每個命令。對于全局標志,在根上指定一個標志作為持久標志。
也可以在本地分配一個標志,該標志只應(yīng)用于該特定命令。
默認情況下,Cobra只解析目標命令上的本地標志,而忽略父命令上的任何本地標志。通過啟用Command.TraverseChildren,Cobra將在執(zhí)行目標命令之前解析每個命令上的本地標志。
使用viper綁定標志
在本例中,持久標志author與viper綁定。注意:當用戶未提供--author標志時,變量author將不會設(shè)置為config中的值。
更多關(guān)于 viper的文檔
Flags默認是可選的,如果希望命令在未設(shè)置標志時報告錯誤,請根據(jù)需要進行標記:
持久性Flags
可以使用命令的Args字段指定位置參數(shù)的驗證。
內(nèi)置了以下驗證器:
在下面的示例中,我們定義了三個命令。兩個是頂級命令,一個(cmdTimes)是頂級命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個子命令。這是通過不為“rootCmd”提供“Run”來實現(xiàn)的。
我們只為一個命令定義了一個標志。
有關(guān)標志的更多文檔,請訪問
對于一個更完整的例子更大的應(yīng)用程序,請檢查 Hugo 。
當您有子命令時,Cobra會自動將help命令添加到應(yīng)用程序中。當用戶運行“應(yīng)用程序幫助”時,將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個名為“create”的命令,沒有任何附加配置;調(diào)用“app help create”時,Cobra將起作用。每個命令都會自動添加“-help”標志。
以下輸出由Cobra自動生成。除了命令和標志定義之外,不需要任何東西。
幫助就像其他命令一樣。它周圍沒有特殊的邏輯或行為。事實上,你可以提供你想提供的。
您可以為默認命令提供自己的幫助命令或模板,以用于以下功能:
當用戶提供無效的標志或無效的命令時,Cobra通過向用戶顯示“用法”來響應(yīng)。
你可以從上面的幫助中認識到這一點。這是因為默認幫助將用法作為其輸出的一部分嵌入。
您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過公共方法重寫:
如果在root命令上設(shè)置了version字段,Cobra會添加一個頂級的'--version'標志。運行帶有“-version”標志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐藴瘦敵觥?梢允褂胏md.SetVersionTemplate(s string)函數(shù)自定義模板。
可以在命令的主運行函數(shù)之前或之后運行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運行之前執(zhí)行。PersistentPostRun和PostRun將在運行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運行:
輸出:
當發(fā)生“未知命令”錯誤時,Cobra將打印自動建議。這使得Cobra在發(fā)生拼寫錯誤時的行為類似于git命令。例如:
基于注冊的每個子命令和Levenshtein距離的實現(xiàn),建議是自動的。匹配最小距離2(忽略大小寫)的每個已注冊命令都將顯示為建議。
如果需要在命令中禁用建議或調(diào)整字符串距離,請使用:
or
您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱。這允許對在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對于某些您不需要別名的字符串。例子:
Cobra可以基于子命令、標志等生成文檔。請在 docs generation文檔 中閱讀更多關(guān)于它的信息。
Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補全功能將非常強大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
當您對外部模塊的存儲庫進行了 fork (例如修復模塊代碼中的問題或添加功能)時,您可以讓 Go 工具將您的 fork 用于模塊的源代碼。這對于測試您自己的代碼的更改很有用。
為此,您可以使用go.mod 文件中的replace指令將外部模塊的原始模塊路徑替換為存儲庫中 fork 的路徑。這指示 Go 工具在編譯時使用替換路徑(fork 的位置),例如,同時允許您保留import 原始模塊路徑中的語句不變。
在以下 go.mod 文件示例中,當前模塊需要外部模塊example點抗 /theirmodule。然后該replace指令將原始模塊路徑替換為example點抗 /myfork/theirmodule模塊自己的存儲庫的分支。
設(shè)置require/replace對時,使用 Go 工具命令確保文件描述的需求保持一致。使用go list命令獲取當前模塊正在使用的版本。然后使用go mod edit命令將需要的模塊替換為fork:
注意: 當您使用該replace指令時,Go 工具不會像添加依賴項中所述對外部模塊進行身份驗證。
您可以使用go get命令從其存儲庫中的特定提交為模塊添加未發(fā)布的代碼。
為此,您使用go get命令,用符號@指定您想要的代碼 。當您使用go get時,該命令將向您的 go.mod 文件添加一個 需要外部模塊的require指令,使用基于有關(guān)提交的詳細信息的偽版本號。
以下示例提供了一些說明。這些基于源位于 git 存儲庫中的模塊。
當您的代碼不再使用模塊中的任何包時,您可以停止將該模塊作為依賴項進行跟蹤。
要停止跟蹤所有未使用的模塊,請運行g(shù)o mod tidy 命令。此命令還可能添加在模塊中構(gòu)建包所需的缺失依賴項。
要刪除特定依賴項,請使用go get,指定模塊的模塊路徑并附加 @none,如下例所示:
go get命令還將降級或刪除依賴于已刪除模塊的其他依賴項。
當您使用 Go 工具處理模塊時,這些工具默認從 proxy.golang.org(一個公共的 Google 運行的模塊鏡像)或直接從模塊的存儲庫下載模塊。您可以指定 Go 工具應(yīng)該使用另一個代理服務(wù)器來下載和驗證模塊。
如果您(或您的團隊)已經(jīng)設(shè)置或選擇了您想要使用的不同模塊代理服務(wù)器,您可能想要這樣做。例如,有些人設(shè)置了模塊代理服務(wù)器,以便更好地控制依賴項的使用方式。
要為 Go 工具指定另一個模塊代理服務(wù)器,請將GOPROXY 環(huán)境變量設(shè)置為一個或多個服務(wù)器的 URL。Go 工具將按照您指定的順序嘗試每個 URL。默認情況下,GOPROXY首先指定一個公共的 Google 運行模塊代理,然后從模塊的存儲庫直接下載(在其模塊路徑中指定):
您可以將變量設(shè)置為其他模塊代理服務(wù)器的 URL,用逗號或管道分隔 URL。
Go 模塊經(jīng)常在公共互聯(lián)網(wǎng)上不可用的版本控制服務(wù)器和模塊代理上開發(fā)和分發(fā)。您可以設(shè)置 GOPRIVATE環(huán)境變量。您可以設(shè)置GOPRIVATE環(huán)境變量來配置go命令以從私有源下載和構(gòu)建模塊。然后 go 命令可以從私有源下載和構(gòu)建模塊。
GOPRIVATE或環(huán)境變量可以設(shè)置為匹配模塊前綴的全局模式列表,這些GONOPROXY前綴是私有的,不應(yīng)從任何代理請求。例如:
新聞名稱:go語言命令工具 go 命令
URL鏈接:http://www.chinadenli.net/article16/ddihcgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站策劃、網(wǎng)站排名、網(wǎng)站內(nèi)鏈、虛擬主機、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)