您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Go1.18多模塊Multi-Module工作區模式是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Go1.18多模塊Multi-Module工作區模式是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在 go 中使用多個模塊可能真的是一件苦差事。特別是當您的一個模塊依賴于另一個模塊時,您需要同時編輯這兩個模塊!
您編輯父模塊,但是然后您需要將其推送到repo。然后在依賴模塊中運行 update 以下載新版本。最終使用2行修復您需要的。至少可以說是一種痛苦。
在 Go 1.18之前,建議使用依賴模塊中的 replace 指令來處理這個問題。
這個方法是有效的,但也有自己的問題,比如需要手動編輯 go.mod,確保你提交代碼時候,不commit 這個 replace等等。
最后,從 Go 1.18開始,引入了一種同時處理多個模塊的新方法,這種方法消除了這些問題: go.work。
Multi-Module, Single Workspace
在做本地的 Go 項目開發時,可能會在本地同時開發多個庫(項目庫、工具庫、第三方庫)等。
如下代碼:
package main import ( "github.com/eddycjy/pkgutil" ) func main() { pkgutil.PrintFish() }
我們看到:該代碼對外唯一的依賴是module path為"github.com/eddycjy/pkgutil"的module,但后者是一個尚在本地進行開發,還未發布到http://github.com上的module。
如果這個時候運行 go run 或是 go mod tidy,都不行,會運行失敗。
報如下類似錯誤:
fatal: repository 'https://github.com/eddycjy/pkgutil/' not found
這個問題報錯是因為 github.com/eddycjy/pkgutil 這個庫,在 GitHub 是沒有的,自然也就拉取不到。
因此,許多同學會發出靈魂質疑:Go 的依賴都必須要上傳到 GitHub 嗎,強綁定?
解決方法:在 Go1.18 以前,我們會通過 replace,又或是直接上傳到 Github 上,自然也就能被 Go 工具鏈拉取到依賴了。
用replace指示符將該版本指向本地的module的開發目錄。
2022 年 3 月 15 日 go 1.18 正式發布,新版本除了對性能的提升之外,還引入了很多新功能,其中就有 go 期盼已久的功能泛型(Generics),同時還引入的多模塊工作區(Workspaces)和模糊測試(Fuzzing)。
彌補了當前go module構建模式的一些不足,堪稱是go module構建模式的最后一塊拼圖。
Go 多模塊工作區能夠使開發者能夠更容易地同時處理多個模塊的工作,如:
方便進行依賴的代碼調試(打斷點、修改代碼)、排查依賴代碼 bug
方便同時進行多個倉庫/模塊并行開發調試
go 使用的是多模塊工作區,可以讓開發者更容易同時處理多個模塊的開發。在 Go 1.17 之前,只能使用 go.mod replace 指令來實現,如果你正巧是同時進行多個模塊的開發,使用它可能是很痛苦的。每次當你想要提交代碼的時候,都不得不刪除掉 go.mod 中的 replace 才能使模塊穩定的發布版本。
在社區的多輪反饋下,Michael Matloob 提出了提案《Proposal: Multi-Module Workspaces in cmd/go[1]》進行了大量的討論和實施,在 Go1.18 正式落地。
新提案的一個核心概念,就是增加了 go work 工作區的概念,針對的是 Go Module 的依賴管理模式。
這個提案引入一個go.work文件用于開啟Go工作區模式。go.work通過directory指示符設置一些本地路徑,這些路徑下的go module構成一個工作區(workspace),Go命令可以操作這些路徑下的go module,也會優先使用工作區中的go module。
其能夠在本地項目的 go.work 文件中,通過設置一系列依賴的模塊本地路徑,再將路徑下的模塊組成一個當前 Go 工程的工作區,也就是 N 個 Go Module 組成 1 個 Go Work, 工作區的讀取優先級是最高的。
總結: 當你的本地有很多module,且這些module存在相互依賴,那么我們可以在這些module的外面建立一個Go工作區,基于這個Go工作區開發與調試這些module就變得十分方便。
只要執行 go work init 就可以初始化一個新的工作區,后面跟的參數就是要生成的具體子模塊 mod。
命令如下:
go work init ./mod ./tools
項目目錄如下:
awesomeProject ├── mod │ ├── go.mod // 子模塊 │ └── main.go ├── go.work // 工作區 └── tools ├── fish.go └── go.mod // 子模塊
通常情況下,建議不要提交 go.work 文件到 git 上,因為它主要用于本地代碼開發。
推薦在: $GOPATH 路徑下執行,生成 go.work 文件
go work init 初始化工作區文件,用于生成 go.work 工作區文件
初始化并寫入一個新的 go.work 到當前路徑下,可以指定需要添加的代碼模塊
示例: go work init ./hello 將本地倉庫 hello 添加到工作區
hello 倉庫必須是 go mod 依賴管理的倉庫(./hello/go.mod 文件必須存在)
use 指定使用的模塊目錄
命令示例:
go work use ./example 添加一個模塊到工作區
命令示例:
go work use ./example 添加一個模塊到工作區 go work use ./example ./example1 添加多個模塊到工作區 go work use -r ./example 遞歸 ./example 目錄到當前工作區 刪除命令使用 go work edit -dropuse=./example 功能
可以使用 go work use hello 添加模塊,也可以手動修改 go.work 工作區添加新的模塊
在工作區中添加了模塊路徑,編譯的時候會自動使用 use 中的本地代碼進行代碼編譯,和 replaces 功能類似。
# 單模塊結構 use ./hello # 多模塊結構 use ( ./hello ./example )
go work edit
用于編輯 go.work 文件
可以使用 edit 命令編輯和手動編輯 go.work 文件效果是相同的
示例:
go work edit -fmt go.work 重新格式化 go.work 文件 go work edit -replace=github.com/link1st/example=./example go.work 替換代碼模塊 go work edit -dropreplace=github.com/link1st/example 刪除替換代碼模塊 go work edit -use=./example go.work 添加新的模塊到工作區 go work edit -dropuse=./example go.work 從工作區中刪除模塊
go env GOWORK
查看環境變量,查看當前工作區文件路徑
可以排查工作區文件是否設置正確,go.work 路徑找不到可以使用 GOWORK 指定
文件結構和 go.mod 文件結構類似,支持 Go 版本號、指定工作區和需要替換的倉庫
文件結構示例:
go 1.18 use ( ./hello ./example ) replace ( github.com/link1st/example => ./example1 )
replaces 替換依賴倉庫地址
replaces 命令與 go.mod 指令相同,用于替換項目中依賴的倉庫地址
需要注意的是 replaces 和 use 不能同時指定相同的本地路徑
錯誤示例
同時在 use 和 replace 指定相同的本地路徑
go 1.18 use ( ./hello ./example ) replace ( github.com/link1st/example => ./example )
同時使用 go.work 和 go.mod replace 功能的的時候分別指定不同的代碼倉庫路徑,go.work 優先級高于 go.mod 中定義
Go 全局變量 GOWORK 設置 off 則可以禁用工作區功能
export GOWORK=off
讀到這里,這篇“Go1.18多模塊Multi-Module工作區模式是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。