管理模組原始碼

當您開發模組以供他人使用時,遵循本主題中描述的倉庫約定可以幫助確保您的模組更易於其他開發人員使用。

本主題描述了您在管理模組倉庫時可能採取的操作。有關從一個版本修訂到另一個版本的工作流步驟序列的資訊,請參閱模組釋出和版本控制工作流

這裡描述的一些約定是模組中必需的,而另一些則是最佳實踐。此內容假定您熟悉管理依賴項中描述的基本模組使用實踐。

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,您將有以下內容:

  • 模組路徑:example.com/mymodules/module1
  • 版本標籤:module1/v1.2.3
  • 使用者匯入的包路徑:example.com/mymodules/module1/package1
  • 使用者 require 指令中指定的模組路徑和版本:example.com/mymodules/module1 v1.2.3

Diagram illustrating two modules in a single repository