iT邦幫忙

2024 iThome 鐵人賽

DAY 20
1
Software Development

可以Go一輩子嗎?系列 第 20

Day20. Module介紹與如何管理依賴 (go mod)

  • 分享至 

  • xImage
  •  

Day20. Module介紹與如何管理依賴 (go mod)

今天來講一下Go語言的Module的基本概念及創建方法,我本來以為Module跟Package是同樣的東西,但其實Module可以看成一堆Package的集合,且兩者還是有部份的差異

項目 套件(Package) 模組(Module)
定義 Go 檔案的集合,包含相關的函式、類型等。 由多個套件組成的一個版本化單位。
範圍 在模組內的更小單位,通常代表某個庫或功能模塊。 更高層級的結構,包含多個套件。
檔案 沒有專門檔案來定義套件。套件由 package 關鍵字指定。 go.mod 檔案來定義模組。
用途 用於在專案內組織和重用程式碼。 用於管理專案的依賴、版本控制及更大規模的程式碼結構。
可見性 透過命名方式來控制(大寫開頭為公開,否則為私有)。 不涉及可見性,主要用於依賴管理與版本控制。
版本控制 套件不單獨版本化。 模組是版本化的,可以管理特定版本的依賴模組。
匯入 可以透過 import "package-path" 來匯入。 模組在 go.mod 檔案中指定依賴,內部的套件可以匯入使用。透過go get來下載依賴的模組。

Module

在講解Module之前,我們需要先瞭解GOPATH的概念,GOPATH是Go語言的一個環境變數,用來指定Go語言的工作目錄,也就是說,我們的Go程式碼必須放在GOPATH下的src目錄下,這樣Go語言才能找到我們的程式碼。但是這樣的管理分式非常不直覺,所以在Go 1.11以後的版本,Go語言引入了Module的概念。

Module是一個目錄,裡面包含了一個go.mod文件,這個文件記錄了這個Module的相關資訊,例如Module的名稱、依賴的Module等等。

建立Module

要建立一個Module,我們需要先進入到我們的專案目錄下,然後執行以下命令:

go mod init <module-name>

這樣就會在當前目錄下生成一個go.mod文件,用來管理裡面一開始只有Module名稱與Go版本,例如:

module mygo

go 1.17

然後我們就可以在這個Module下開始寫我們的程式碼了。
如果想把這個Module發佈到Github上,我們需要將Module的名稱改為Github的Repository名稱,例如:

go mod init github.com/c8763yee/mygo
# go mod init github.com/<username>/<module-name-or-repo-name-without-dot-git>
# or setup in go.mod
module github.com/c8763yee/mygo

go.mod的關鍵字

  • module:定義Module的名稱
  • go:定義Go的版本,這樣可以確保我們的程式碼在不同的Go版本下都能正常運行。
  • require:定義這個Module需要哪些外部的Module與指定的版本號。
  • replace:用來暫時替換某個Module為本地的Module資料夾,通常用於開發過程中,例如我們可以將某個Module替換為本地的Module(語法:replace <module-name> => <local-path>)
  • exclude:用來排除某個Module,通常用於避免某個Module與其他Module衝突。
  • Example
module github.com/c8763yee/mygo

go 1.19
require (
    github.com/gin-gonic/gin v1.7.4
    github.com/go-sql-driver/mysql v1.6.0
)
replace mygo/five/exclamation => ../five/exclamation
replace excluded-module v1.2.3 => ./excluded-module

require mygo/five/exclamation v0.0.0-7-30120-30168
exclude excluded-module v1.2.3


那麼今天的文章就到這告一段落,如果我的文章有任何地方有錯誤請在留言區反應
這兩天將會介紹Go語言的內建套件:如time、strings, log, sort
time


上一篇
Day19. Package的基本概念及創建方法
下一篇
Day21 內建套件介紹(一):time、strings, encoding
系列文
可以Go一輩子嗎?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言