2 回答

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
一般來說,模塊應(yīng)該是包的集合。
但是您仍然可以創(chuàng)建單個(gè)包的模塊。這可能只有在您希望這些包具有不同的生命周期時(shí)才有意義。當(dāng)您想從另一個(gè)項(xiàng)目導(dǎo)入這些模塊并且不希望整個(gè)包集合的開銷時(shí),它也可能有意義。
一般來說:
模塊是相關(guān)的 Go 包的集合,它們作為一個(gè)單元一起進(jìn)行版本控制。
模塊記錄精確的依賴需求并創(chuàng)建可重現(xiàn)的構(gòu)建。
大多數(shù)情況下,版本控制存儲(chǔ)庫只包含一個(gè)在存儲(chǔ)庫根目錄中定義的模塊。(單個(gè)存儲(chǔ)庫支持多個(gè)模塊,但通常這會(huì)比每個(gè)存儲(chǔ)庫一個(gè)模塊導(dǎo)致更多的持續(xù)工作)。
總結(jié)存儲(chǔ)庫、模塊和包之間的關(guān)系:
一個(gè)存儲(chǔ)庫包含一個(gè)或多個(gè) Go 模塊。2.每個(gè)模塊包含一個(gè)或多個(gè)Go包。3. 每個(gè)包由一個(gè)或多個(gè) Go 源文件組成,位于一個(gè)目錄中。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
我知道這是一個(gè)老問題,但是在一個(gè)存儲(chǔ)庫中管理多個(gè)模塊時(shí),有一些更多的細(xì)節(jié)值得一提,無論有沒有go.work
.
長話短說
每種方法都有利有弊,但如果您正在處理包含許多模塊的大型代碼庫,我建議堅(jiān)持使用基于提交或標(biāo)簽的版本處理,并使用 Go Workspace 進(jìn)行日常開發(fā)。
轉(zhuǎn)到模塊詳細(xì)信息
replace
沒有版本控制的指令
當(dāng)你使用replace
指向本地目錄的指令時(shí),你會(huì)發(fā)現(xiàn)依賴模塊的版本為v0.0.0-00010101000000-000000000000
.?基本上你得不到版本信息。
使用模塊路徑go.mod
定義的主要模塊無法進(jìn)行可重現(xiàn)的構(gòu)建,因?yàn)橹噶畹囊蕾嚹繕?biāo)可能已更新其內(nèi)容。如果許多模塊使用的依賴目標(biāo),這可能會(huì)特別成問題。這種通用包中的任何更改都可能同時(shí)導(dǎo)致所有依賴項(xiàng)的行為更改。github.com/name/project
github.com/name/project
replace
github.com/name/project/players
如果那不是您關(guān)心的問題,replace
指令應(yīng)該絕對(duì)可以正常工作。在這樣的設(shè)置中,go.work
可能是您并不真正需要的層。
有版本控制
如果您想確保版本設(shè)置適用于多個(gè)模塊的可重現(xiàn)和確定性構(gòu)建,您可以采用幾種不同的方法。
一go.mod
,一個(gè)存儲(chǔ)庫
這可能是最簡單的方法。對(duì)于每個(gè)模塊,都有清晰的提交歷史記錄和版本控制。只要您通過遠(yuǎn)程存儲(chǔ)庫引用模塊,這可能是最簡單的設(shè)置,并且依賴設(shè)置非常清晰。
但是,請(qǐng)注意,這種方法意味著您需要管理多個(gè)存儲(chǔ)庫,并且提供go.work
幫助將需要適當(dāng)?shù)谋镜啬夸浻成洌@對(duì)于代碼庫的新手來說可能很困難。
基于提交的版本控制
仍然可以使用版本信息確定性地定義依賴關(guān)系,以便您可以在單個(gè)存儲(chǔ)庫中構(gòu)建代碼?;谔峤坏姆椒ㄐ枰钌俚牟襟E,并且仍然可以很好地工作。不過,有一些問題需要注意。
要
github.com/name/project
對(duì) 具有依賴性github.com/name/project/players
,您需要確保所需的代碼在遠(yuǎn)程存儲(chǔ)庫中。這是因?yàn)?code>github.com/name/project將從遠(yuǎn)程存儲(chǔ)庫中提取代碼和提交信息,即使存儲(chǔ)庫的本地副本上有相同的代碼也是如此。這確保了從提交引用中獲取的版本github.com/name/project/players
,例如v0.1.1-0.20220418015705-5f504416395d
(ref:?details of "pseudo-version"?)模塊名稱必須與目錄結(jié)構(gòu)匹配。例如,如果您有單個(gè)存儲(chǔ)庫
github.com/name/project
和模塊/src/mymodule/
,則模塊名稱必須是github.com/name/project/src/mymodule
。這是因?yàn)楫?dāng)模塊路徑解析發(fā)生時(shí),Go 會(huì)找到存儲(chǔ)庫的根目錄(在上面的示例中,這將是github.com/name/project.git
),然后嘗試根據(jù)模塊名稱跟蹤目錄路徑。如果您在私有存儲(chǔ)庫中工作,則需要確保
go.sum
檢查不會(huì)阻止您。您可以簡單地使用GOPRIVATE=github.com/name/project
來指定您不希望跳過校驗(yàn)和驗(yàn)證的路徑。
基于標(biāo)簽的版本控制
除了使用提交 SHA,您還可以使用 Git 標(biāo)簽。
但是因?yàn)橐粋€(gè)存儲(chǔ)庫中可能有很多模塊,Go Module 需要找到哪個(gè)標(biāo)簽映射到哪個(gè)。例如,具有以下目錄結(jié)構(gòu):
# All assumed to be using `github.com/name/project` prefix before package name
mypackage/? ? ? ? ? # v1.0.0
anotherpackage/? ? ?# v0.5.1
nested/dependency/? # v0.8.3
您將需要在 中創(chuàng)建標(biāo)簽github.com/name/project,其名稱與目錄結(jié)構(gòu)完全匹配,例如:
mypackage/v1.0.0
anotherpackage/v0.5.1
nested/dependency/v0.8.3
這樣,每個(gè)標(biāo)簽都被 Go Module 正確引用,并且您的依賴關(guān)系可以保持確定性。
go.work行為
如果您go.work在父目錄上有g(shù)o work use github.com/name/project/players等,則優(yōu)先使用本地文件。即使您在go.mod.
對(duì)于跨多個(gè)項(xiàng)目的本地開發(fā),Go Workspace 是一種同時(shí)處理多個(gè)事物的好方法,而無需先推送依賴項(xiàng)的代碼更改。但與此同時(shí),實(shí)際發(fā)布仍然需要分解提交,以便稍后在其他代碼更改中引用第一次提交。
go.work據(jù)說是您很少需要提交到存儲(chǔ)庫的文件。不過,您必須了解在父路徑中具有的影響go.work。
- 2 回答
- 0 關(guān)注
- 172 瀏覽
添加回答
舉報(bào)