2022年6月30日 星期四

GoLang 如何使用自己 localhost 的 module

如果你今天的專案需要引用一個並不在網上,而是自己 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

⚠️注意:這方法僅適用於 go 1.18及以上的版本

首先到 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

沒有留言:

張貼留言