如果你今天的專案需要引用一個並不在網上,而是自己 localhost 的 module時要如何做?
倘若我在電腦中有兩個專案: foo 和 bar,架構如下
D:\go-workspace ├─foo │ │ go.mod │ │ │ ├─data │ ├─errors │ └─maps └─bar go.mod
若 bar 想要引用 foo 的話,他的 go.mod 大概會這樣寫:
module bar
go 1.18
require example.com/foo v0.0.0-20060102150405-abcdefg
但今天可能因為各種理由,像是下面這幾種:
- foo 經常需要和 bar 一同修改,使 foo 難以每個修改都先 push 到遠端
- foo 是私有 library
- foo 其實不是網路上的 library
1. 使用 Workspace
首先到 D:\go-workspace
執行以下指令
D:\go-workspace> go work init
D:\go-workspace> go work use ./foo
D:\go-workspace> go work use ./bar
會在 D:\go-workspace
看到一個叫做 go.work 的檔案,裡面的內容如下
go 1.18
use (
./foo
./bar
)
之後 bar 所有引用的 foo 的 code,都會直接去看 D:\go-workspace\foo
,而不是遠端的檔案了
2. 使用 replace
另一種方法是將 bar 裡面 go.mod 的 required example.com/foo
那行改成 replace 專案 => foo 專案的 path
,例如:
module bar
go 1.18
replace example.com/foo => D:/go-workspace/foo
之後再執行go mod tidy
即可
這方法雖然適用於支援 go module 後的所有版本,但缺點是「裡面 replace 所指定的資料夾位置是你電腦的資料夾位置」,如果換一台電腦開發,這段 replace 的地址就要更換了。
參考資料
(2018, August 26). vgo - Accessing local packages within a go module (go 1.11) . Stack Overflow. https://stackoverflow.com/q/52026284
(N.D.). Tutorial: Getting started with multi-module workspaces. The Go Programming Language. Go. https://go.dev/doc/tutorial/workspaces
Seekload, (2022, March 18). Go 1.18 workspace 使用初体验_Seekload的博客-CSDN博客. CSDN. https://blog.csdn.net/asd1126163471/article/details/123587825
沒有留言:
張貼留言