go的多模塊工作區(qū)是從1.18 版本開(kāi)始的聊品,所以要使用它首先要確認(rèn)go 的版本递雀。
$go version
go version go1.18 windows/amd64
一下教程介紹了一個(gè)多模塊工作區(qū)的用例项棠。在多模塊工作區(qū)中創(chuàng)建兩個(gè)模塊悲雳,對(duì)這些模塊進(jìn)行更改,并在構(gòu)建中查看這些更改的結(jié)果:
1. 創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)名為workspace 的目錄香追,作為本次案例多模塊的家目錄
$ mkdir workspace
2. 創(chuàng)建項(xiàng)目
- 進(jìn)入工作區(qū)目錄如下指令創(chuàng)建一個(gè)目錄作為hello 的項(xiàng)目合瓢,并通過(guò)go mo初始化
$ cd workspace $ mkdir hello $ cd hello $ go mod init example.com/hello go: creating new go.mod: module example.com/hello
- 在該項(xiàng)目下,創(chuàng)建hello.go 文件透典,并創(chuàng)建如下main 函數(shù)晴楔, 并通過(guò)
go mod tidy
命令 同步第三方依賴包package main import ( "fmt" "golang.org/x/example/stringutil" ) func main() { fmt.Println(stringutil.Reverse("Hello")) }
3. 創(chuàng)建工作區(qū)
- 創(chuàng)建一個(gè) go.work 文件來(lái)指定帶有模塊的工作區(qū),在工作目錄中(workspace 目錄),指令如下:
// go work init [路徑] $ go work init ./hello
go work init 命令告訴 go 為包含 ./hello 目錄中的模塊的工作空間創(chuàng)建一個(gè) go.work 文件峭咒。 go 命令生成一個(gè)如下所示的 go.work 文件:
go 1.18
use ./hello
go.work 文件的語(yǔ)法與 go.mod 相似税弃。 go 指令告訴 Go 應(yīng)該使用哪個(gè)版本的 Go 來(lái)解釋文件。它類似于 go.mod 文件中的 go 指令凑队。 use 指令告訴 Go 在構(gòu)建時(shí)则果, hello 目錄中的模塊應(yīng)該是主模塊。 因此漩氨,在工作區(qū)的任何子目錄中西壮,該模塊都將處于活動(dòng)狀態(tài)
在workspace目錄中,運(yùn)行hello 模塊,此時(shí)可以正常運(yùn)行
$ go run example.com/hello
olleH
工作區(qū)中的所有模塊和go 命令都會(huì)被作為作為主模塊叫惊。這允許我們?cè)谀K中引用一個(gè)包款青,甚至在該包在模塊之外。在模塊或工作區(qū)之外運(yùn)行 go run 命令會(huì)導(dǎo)致錯(cuò)誤霍狰,因?yàn)?go 命令不知道要使用哪些模塊抡草。 接下來(lái),我們將 golang.org/x/example 模塊的本地副本添加到工作區(qū)蚓耽。然后渠牲,我們將向 stringutil 包添加一個(gè)新函數(shù),我們可以使用它來(lái)代替 Reverse步悠。
- 克隆golang.org/x/example
在工作區(qū)運(yùn)行如下指令來(lái)克隆example代碼
$ git clone https://go.googlesource.com/example
Cloning into 'example'...
remote: Total 165 (delta 27), reused 165 (delta 27)
Receiving objects: 100% (165/165), 434.18 KiB | 1022.00 KiB/s, done.
Resolving deltas: 100% (27/27), done.
通過(guò)如下指令將克隆的example 項(xiàng)目添加到工作目錄中
go work use ./example
此時(shí)查看go.work 文件如下所示
go 1.18
use (
./example
./hello
)
該模塊現(xiàn)在包括 example.com/hello 模塊和 golang.org/x/example 模塊签杈。 這將允許我們使用我們將在 stringutil 模塊的副本中編寫(xiě)的新代碼,而不是使用 go get 命令下載的模塊緩存中的模塊版本.此時(shí)example和hello 模塊相當(dāng)于是本地私有模塊鼎兽,可以任意修改
- 修改example 目錄中代碼
我們將在 golang.org/x/example/stringutil 包中添加一個(gè)將字符串大寫(xiě)的新函數(shù)答姥。 在 workspace/example/stringutil 目錄中創(chuàng)建一個(gè)名為 toupper.go 的新文件,其中包含以下內(nèi)容
package stringutil
import "unicode"
// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
r := []rune(s)
for i := range r {
r[i] = unicode.ToUpper(r[i])
}
return string(r)
}
- 修改對(duì)應(yīng)hello模塊
修改hello模塊中對(duì)字符串反轉(zhuǎn)的函數(shù)為新的ToUpper 函數(shù)(上面新添加的函數(shù))
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.ToUpper("Hello"))
- 運(yùn)行hello模塊
$ go run example.com/hello
HELLO
Go 命令在 go.work
文件指定的hello
目錄中找到命令行中指定的example.com/hello
模塊谚咬,并使用類似的方法解析golang.org/x/example
導(dǎo)入go.work
文件鹦付。 可以使用 go.work
而不是添加 replace
指令來(lái)跨多個(gè)模塊工作。 由于這兩個(gè)模塊位于同一個(gè)工作區(qū)中择卦,因此很容易在一個(gè)模塊中進(jìn)行更改并在另一個(gè)模塊中使用它敲长。
4 指令集
- go work init
用法:go work init [moddirs]
在當(dāng)前目錄中初始化并寫(xiě)入一個(gè)新的 go.work 文件郎嫁,實(shí)際上是在當(dāng)前目錄中創(chuàng)建了一個(gè)新的工作空間。 go work init 可選擇接受工作區(qū)模塊的路徑作為參數(shù)祈噪。如果省略該參數(shù)泽铛,將創(chuàng)建一個(gè)沒(méi)有模塊的空工作區(qū)。 每個(gè)參數(shù)路徑都添加到 go.work 文件中的 use 指令中辑鲤。當(dāng)前的 go 版本也將列在 go.work 文件中盔腔。
利潤(rùn)上面例子中,通過(guò)go mod init ./hello
指令在workspace 目錄下月褥,創(chuàng)建了一個(gè)go.work 文件弛随,并將hello 模塊路徑添加到go.work 中,具體內(nèi)容如下:
go 1.18
use ./hello
-
go work edit
用法:go work edit [editing flags] [go.work]
go work edit 命令提供了一個(gè)用于編輯 go.work 的命令行接口宁赤,主要供工具或腳本使用舀透。它只讀取 go.work;不查找有關(guān)所涉及模塊的信息。如果沒(méi)有指定文件礁击,Edit 在當(dāng)前目錄及其父目錄中查找 go.work 文件editing flags:
fmt:
fmt 標(biāo)志重新格式化 go.work 文件而不進(jìn)行其他更改盐杂, 此標(biāo)志只能單獨(dú)使用逗载,不能和其他標(biāo)志同時(shí)使用,
示例:go work edit -fmt
replace:
-replace=old[@v]=new[@v]
指定模塊的新模塊與舊模塊的替代, 其中版本號(hào)(@v
)可以被省略哆窿。如果舊模塊中的版本號(hào)(@v
)被省略了, 相當(dāng)于指定了舊模塊的所有版本厉斟; 如果新模塊中的版本號(hào)(@v
)被省略了挚躯,則新模塊的路徑應(yīng)該是本地模塊根目錄,而不是模塊路徑dropuse:
從 go.work 文件的模塊目錄集中刪除一個(gè) use 指令擦秽, 用法go work edit -dropuse=待刪除模塊的路徑
dropreplace:
刪除給定模塊路徑和版本對(duì)的替換go:
設(shè)置go.work 文件中的go 語(yǔ)言版本码荔,go work edit -go=1.18
- go work use
用法:go work use [-r] [moddirs]
go work use
命令提供了一個(gè)命令行接口,用于將模塊目錄(-r: 可以選擇以遞歸方式)添加到 go.work
文件中感挥。
-r
: 標(biāo)志遞歸搜索參數(shù)目錄中的模塊
- go work sync
用法:go work sync
go work sync
命令將工作區(qū)的構(gòu)建列表同步回工作區(qū)的模塊