GO 專案依賴管理:go module總結

2023-06-18 06:01:08

轉載請註明出處:

1.go module介紹

  go module是go官方自帶的go依賴管理庫,在1.13版本正式推薦使用 go module可以將某個專案(資料夾)下的所有依賴整理成一個 go.mod 檔案,裡面寫入了依賴的版本等 使用go module之後我們可不用將程式碼放置在src下 使用 go module 管理依賴後會在專案根目錄下生成兩個檔案 go.mod(會記錄當前專案的所依賴)和go.sum(記錄每個依賴庫的版本和雜湊值)

  包管理工具go mod具有以下特性:

    1)自動下載依賴包,即第三方包。

    2)自定義包無須放在GOPATH設定的路徑。

    3)第三方包或自定義包寫在go.mod檔案中,通過go.mod檔案管理包。

    4)已經轉移的第三方包或自定義包,在go.mod檔案中使用replace替換,不需要修改程式碼。

    5)對第三方包指定版本號。

2.GO111MODULE設定

  GO111MODULE 是 Go 1.11 版本後引入的模組管理功能。使用 GO111MODULE 可以讓 Go 語言專案獲得更好的包管理和版本控制功能。 GO111MODULE 的設定有以下幾種:

  1. auto:在 $GOPATH/src 之外的專案和使用了 Go 1.11 之前的依賴管理方式的專案開啟模組支援,其他專案不開啟。當專案在 GOPATH/src 目錄之外,並且專案根目錄有 go.mod 檔案時,才開啟 go module

  2. on:開啟模組支援,無論專案是否在 $GOPATH/src 下。啟用 go module,編譯時會忽略GOPATHvendor資料夾,只根據go.mod下載依賴,這種模式稱作module-aware模式,這種模式下,GOPATH不再在build時扮演匯入的角色,但是儘管如此,它還是承擔著儲存下載依賴包的角色。它會將依賴包放在GOPATH/pkg/mod目錄下

  3. off:關閉模組支援,使用 GOPATH 和 vendor 目錄作為依賴管理方式。 可以通過設定環境變數 GO111MODULE 或者在專案目錄中建立 go.mod 檔案來設定 GO111MODULE。

    GO111MODULE=off: 禁用 go module,編譯時會在vendor目錄下和GOPATH目錄中查詢依賴包。也把這種模式叫GOPATH模式

3.GO ROOT 與 GO PATH

  GOPATH

  GOPATH是Go語言的工作目錄,它是一個環境變數,用於指定Go語言原始碼、依賴庫和可執行檔案的存放位置。在Go語言中,所有的原始碼都必須存放在GOPATH目錄下的src子目錄中,所有的依賴庫和可執行檔案則分別存放在GOPATH目錄下的pkg和bin子目錄中

  GOPATH的作用是指定Go語言原始碼、依賴庫和可執行檔案的存放位置,並且在編譯專案時自動查詢相應的檔案。

               

  通過go env檢視go環境相關的設定,可以看到 GO111MODULE 沒有設定,預設為關閉off,專案的go依賴檔案下載到 go path 目錄中對應的src資料夾下:

                     

  GOROOT

  GOROOT是Go語言的安裝目錄,它是一個環境變數,用於指定Go語言的安裝路徑。在Go語言中,所有的標準庫都存放在GOROOT目錄下的src子目錄中,所有的可執行檔案則存放在GOROOT目錄下的bin子目錄中。

4.環境設定設定

  Windows 下開啟 GO111MODULE 的命令為:

set GO111MODULE=on 
set GO111MODULE=auto

  go 1.3版本之後,可以通過以下命令修改GO111MODULE:

go env -w GO111MODULE=on 
go env -w GO111MODULE=auto

  linux設定

# 開啟模組支援
export GO111MODULE=on
# 關閉模組支援
export GO111MODULE=off

5.建立go.mod檔案

  在專案目錄中執行以下命令會自動建立 go.mod 檔案:

go mod init <module-name>

  其中,module-name 是你的專案名稱。 管理依賴倉庫: 當 GO111MODULE 開啟時,Go 語言會優先從 go.mod 檔案中的模組資訊中獲取依賴庫的版本資訊,如果沒有找到,則會去 GOPATH 和 vendor 目錄下查詢依賴庫。 使用 go get 命令或者直接修改 go.mod 檔案來管理依賴庫的版本資訊。例如:

# 使用 go get 命令安裝依賴庫(會自動更新 go.mod 檔案)
go get -u github.com/gin-gonic/gin
# 直接修改 go.mod 檔案
require (
    github.com/gin-gonic/gin v1.6.3
)

  可以使用以下命令來更新依賴庫:

go mod tidy  # 移除不需要的依賴庫
go mod vendor  # 將依賴庫複製到 vendor 目錄下
go mod download  # 下載依賴庫

6.go.mod 檔案說明

  如在mygo專案的目錄下,輸入go mod init mygo 指令即可在mygo下建立go.mod檔案

  在mygo的go.mod中設定自定義包mpb的資訊,mygo的go.mod程式碼如下

module mygo
    go 1.18
    require (
        mpb v0.0.0
    )
    replace mpb => ./mpb

  go.mod的程式碼說明如下:

    1)module mygo代表當前go.mod檔案隸屬於資料夾mygo。

    2)go 1.18代表當前Go語言的版本資訊。

    3)require代表需要呼叫第三方包或自定義包,小括號裡面一行程式碼代表一個包資訊。

    4)mpb v0.0.0代表包的資訊,mpb是包名,v0.0.0是當前包的版本資訊。

    5)replace為require的包指定新的路徑地址,常用於本地自定義包或第三方包的路徑遷移,例如mpb => ./mpb代表自定義包mpb為當前路徑的資料夾mpb。