Go Wiki:PackagePublishing
簡介
現在您已花費許多時間撰寫套件,並對其進行除錯和測試(您確實有 測試 它,不是嗎?),您想要發布它,以便其他人可以 go get 您的套件。
首先,您需要將它線上託管在某處。三個主要的程式碼託管網站是 bitbucket (hg/git)、GitHub (git) 和 launchpad (bzr)。我建議選擇您熟悉的版本控制系統,或是在您的機器上以版本控制方式儲存您的程式碼。Git (git) 是中央 Go 儲存庫使用的版本控制系統,因此它最接近保證,因為想要使用您的專案的開發人員將擁有正確的軟體。如果您從未使用過版本控制,這些網站有一些不錯的 HOWTO,而且您可以在 Google 中搜尋「{name} 教學」,其中 {name} 是您想學習的版本控制系統名稱,找到許多很棒的教學課程。
套件設定
選擇匯入
您的套件的完整匯入通常會包含一些識別其作者的內容(特別是在 GitHub 等託管網站上,其中「github.com/kylelemons/…」是完整匯入),應始終包含專案名稱,並且如果與專案名稱不同,應以您開發的套件名稱結尾。例如,go-gypsy 專案提供一個 yaml 套件,並由 Kyle Lemons 編寫,因此具有以下匯入路徑
import "github.com/kylelemons/go-gypsy/yaml"
^ ^ ^ ^
| | | `-- Package name
| | `-------- Project name
| `------------------- Author's handle
`----------------------------- Hosting site
Go >= 版本 1 支援套件儲存庫的子目錄。
子目錄
通常,您用於套件的名稱會包含「Go」作為其前綴、後綴或縮寫的一部分,而且您可能希望這成為 go 原始檔中實際命令或套件名稱的一部分。通常,您的套件中可能同時包含函式庫和命令,而且它們無法共存在同一個目錄中。當發生這些情況時,您會希望使用子目錄來建構您的儲存庫。
例如,考慮一個提供「epub」套件和「publish」命令的專案「Go-PublishingExample」。目錄結構可以是
./epub/ # Package source, all files package "epub"
./publish/ # Command source
./doc/ # Documentation which won't be downloaded
./examples/ # Example code which won't be downloaded
套件的匯入陳述式看起來像
import "codesite.tld/authorName/Go-PublishingExample/epub"
通常建議確保最後的目錄路徑(在本例中為「epub」)與目錄中原始檔案所使用的套件名稱相符。在本例中,基本目錄中未包含任何可取得的檔案,因為二進位檔案和套件都不會命名為「Go-PublishingExample」。
分支和標籤
請注意,本節已過時。下列的偽版本號碼適用於 Go < 版本 1;此外,Go 儲存庫本身現在使用 Git,而非 Mercurial。我們或許應該移除本節。
您可以使用「go help get」和「go help importpath」取得 go get 的最新資訊。
一般而言,Go 原始碼樹可以存在於三種基本狀態中。它可以簽出在 Go Release 分支(撰寫本文時為 r60(在 Google Code 上)– 這是大多數使用者應該所在的位置),或者它可以簽出在 Go Weekly(大約每週建立一次的新標籤),或在 tip(Mercurial 中最新變更的術語)。後兩者主要適用於 Go 語言本身的開發人員或需要尚未引入最新版本中的功能或修正的開發人員。
由於您可能會繼續與團隊合作處理尚未準備好供一般使用之程式碼的專案,建議您使用版本控制系統的標記或分支功能。go get 工具了解一些特殊標籤和分支,您可能想要使用這些標籤和分支,以確保使用者取得相容版本的套件
go.r60 -- A "go.r##" tag will be checked out if the user has that Go release installed
go.weekly.2011-07-19 -- A "go.weekly.YYYY-MM-DD" tag will be checked out if the user has that weekly installed
如果已安裝的標籤沒有任何符合項,Go get 將嘗試退回到前一個標籤,如果找不到任何符合項,則預設安裝 tip。
在 Mercurial 中建立並維護您的發行標籤
## Create or update a release tag
hg tag myProj-v0.0 # tag an easy-to-remember version number if you wish
hg tag go.r60 # tag this as being go release.r60 compatible
在 Git 中建立並維護發行分支
## Create a release branch
git tag myProj-v0.0 # Tag an easy-to-remember version number if you wish
git checkout -b go.r60 # create a release branch
git checkout master # to switch back to your master branch
## Update the release branch
git checkout go.r60 # switch to the release branch
git merge master # merge in changes from the master branch since last release
git checkout master # switch back to master branch
如果您使用其他分支名稱,請在必要時替換這些名稱。
通常不需要維護每週標籤或分支,但是維護發行分支或標籤非常有用,因為這將確保您的專案擁有最廣泛的受眾。
指令與套件
由於 go get 不使用專案的 Makefiles,因此了解它將如何實際建置您的專案非常重要。
同一個目錄中的所有檔案應始終共用同一個套件名稱。任何以 _test
或 _os
和/或 _arch
字尾命名的檔案都將被忽略(除非作業系統/架構相符)。如果套件名稱為「main」,go get 將從原始檔建置一個可執行檔,並根據目錄名稱(僅使用最後一個路徑區段)為其命名。如果套件名稱是其他任何名稱,go get 將會將其建置為一個套件,而匯入路徑將是專案根目錄的可網路存取 URL,後接子目錄。請參閱 go get 文件,了解如何為除主要四個網站之外的程式碼託管網站建立匯入路徑。
同一個專案中的套件之間的相依性很常見。在專案中的一個套件或指令依賴於另一個套件或指令的情況下,您必須使用完整的匯入路徑,以便 go get 辨識相依性並確保其建置。如果您的專案中從原始檔匯入的第三方套件尚未存在,go get 也會自動下載並安裝它們。
要重複使用上述範例,檔案 ./publish/main.go
可能看起來像這樣
package main
import (
"flag"
)
import "codesite.tld/authorName/Go-PublishingExample/epub"
var dir = flag.String("dir", ".", "Directory to publish")
func main() {
flag.Parse()
epub.Publish(*dir)
}
想要安裝此可執行檔的使用者會執行
go get codesite.tld/authorName/Go-PublishingExample/publish
這也會因為相依性而安裝 ".../epub"
套件。單純想要安裝函式庫的開發人員可以執行
go get codesite.tld/authorName/Go-PublishingExample/epub
並且(如果他們尚未安裝 publish
)只會下載並安裝套件。請注意,在這些情況下,不會下載範例或文件;在多數情況下,這些範例或文件可透過程式碼網站瀏覽。
文件
godoc
當您準備發佈套件時,您應該透過執行 godoc 的本機副本,來確保文件看起來正確。如果您的套件已安裝到 go 套件樹,您可以使用下列指令
godoc -http=:6060 &
然後瀏覽至 https://127.0.0.1:6060/pkg/ 並尋找您的套件。
儀表板
Go 儀表板會使用您的套件層級註解的第一行(也使用正常的 godoc 格式)作為「資訊」文字,因此請務必設定此行。例如
// Package epub is an example publishing library.
package epub
有關 godoc 的更多資訊,請參閱 文件化 Go 程式碼 部落格文章。
此內容是 Go Wiki 的一部分。