管理模組來源

當您開發要發布供其他人使用的模組時,您可以遵循本主題中所述的儲存庫慣例,協助確保您的模組更易於其他開發人員使用。

本主題說明您在管理模組儲存庫時可能執行的動作。如需有關您在版本間進行修改時會執行的工作流程步驟順序的資訊,請參閱 模組發布和版本控管工作流程

此處描述的一些慣例是模組中必要的,而另一些則是最佳實務。此內容假設您熟悉管理相依性中描述的基本模組使用實務。

Go 支援下列儲存庫來發佈模組:Git、Subversion、Mercurial、Bazaar 和 Fossil。

有關模組開發的概觀,請參閱開發和發佈模組

Go 工具如何尋找您發佈的模組

在 Go 的分散式系統中,用於發佈模組和擷取其程式碼,您可以在將程式碼留在儲存庫中時發佈您的模組。Go 工具依賴命名規則,其中儲存庫路徑和儲存庫標籤表示模組的名稱和版本號碼。當您的儲存庫遵循這些需求時,您的模組程式碼可以透過 Go 工具(例如go get 命令)從您的儲存庫下載。

當開發人員使用 go get 命令來取得程式碼匯入的套件原始程式碼時,命令會執行下列動作

  1. 從 Go 原始程式碼中的 import 陳述式,go get 會識別套件路徑內的模組路徑。
  2. 使用從模組路徑衍生的 URL,命令會在模組代理伺服器或其儲存庫中直接找到模組來源。
  3. 透過將模組的版本號碼與儲存庫標籤配對,找到要下載的模組版本的來源,以找出儲存庫中的程式碼。當尚未知道要使用的版本號碼時,go get 會找到最新的發行版本。
  4. 擷取模組來源並將其下載到開發人員的本機模組快取。

在儲存庫中整理程式碼

透過遵循此處描述的慣例,您可以簡化維護並改善開發人員使用您的模組的體驗。將您的模組程式碼放入儲存庫通常與其他程式碼一樣簡單。

以下圖示說明一個具有兩個套件的簡單模組之來源階層。

Diagram illustrating a module source code hierarchy

您的初始提交應包含下表中列出的檔案

檔案 說明
LICENSE 模組的授權。
go.mod

描述模組,包括其模組路徑(實際上是其名稱)及其相依性。如需進一步資訊,請參閱 go.mod 參考

模組路徑會在模組指令中提供,例如

module example.com/mymodule

如需有關選擇模組路徑的更多資訊,請參閱 管理相依性

雖然您可以編輯 go.mod 檔案,但您會發現透過 go 指令進行變更更可靠。

go.sum

包含代表模組相依性的加密雜湊。Go 工具使用這些雜湊來驗證已下載的模組,嘗試確認已下載的模組是真實的。如果此確認失敗,Go 會顯示安全性錯誤。

當沒有相依性時,檔案會是空的或不存在。您不應編輯此檔案,除非使用 go mod tidy 指令,這會移除不需要的項目。

套件目錄和 .go 來源。 組成模組中 Go 套件和來源的目錄和 .go 檔案。

從命令列,您可以建立一個空的儲存庫,新增將成為您初始提交一部分的檔案,並提交訊息。以下是使用 git 的範例

$ git init
$ git add --all
$ git commit -m "mycode: initial commit"
$ git push

選擇儲存庫範圍

當程式碼應獨立於其他模組中的程式碼進行版本控制時,您會在模組中發布程式碼。

設計存放庫的方式,讓其在根目錄中只存放一個模組,有助於簡化維護工作,特別是在隨著時間推移發布新的次要版本和修補版本、分歧成新的主要版本等情況下。不過,如果你的需求需要,你也可以在單一存放庫中維護多個模組。

每個存放庫只存放一個模組

你可以維護一個存放庫,其中只有一個模組的來源。在此模式中,你將 go.mod 檔案放在存放庫根目錄,並在下方放置包含 Go 來源的套件子目錄。

這是最簡單的方法,讓你的模組更容易隨著時間推移進行管理。它有助於避免需要使用目錄路徑為模組版本號碼加上字首。

Diagram illustrating a single module's source in its repository

在單一存放庫中存放多個模組

你可以從單一存放庫發布多個模組。例如,你可能在單一存放庫中擁有構成多個模組的程式碼,但想要分別為這些模組設定版本。

每個身為模組根目錄的子目錄都必須有自己的 go.mod 檔案。

在子目錄中存放模組程式碼會改變發布模組時必須使用的版本標籤形式。你必須使用身為模組根目錄的子目錄名稱為標籤的版本號碼部分加上字首。如需瞭解版本號碼的更多資訊,請參閱 模組版本編號

例如,對於下列模組 example.com/mymodules/module1,你會為版本 v1.2.3 擁有以下內容

Diagram illustrating two modules in a single repository