golang - 多模塊工作區(qū)(multi-module workspaces)

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 指令集
  1. 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
  1. 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

  1. go work use
    用法go work use [-r] [moddirs]

go work use 命令提供了一個(gè)命令行接口,用于將模塊目錄(-r: 可以選擇以遞歸方式)添加到 go.work 文件中感挥。
-r: 標(biāo)志遞歸搜索參數(shù)目錄中的模塊

  1. go work sync
    用法go work sync
    go work sync 命令將工作區(qū)的構(gòu)建列表同步回工作區(qū)的模塊
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缩搅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子触幼,更是在濱河造成了極大的恐慌硼瓣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件置谦,死亡現(xiàn)場(chǎng)離奇詭異堂鲤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)媒峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)瘟栖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谅阿,你說(shuō)我怎么就攤上這事半哟〕曷耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵寓涨,是天一觀的道長(zhǎng)敏晤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缅茉,這世上最難降的妖魔是什么嘴脾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔬墩,結(jié)果婚禮上译打,老公的妹妹穿的比我還像新娘。我一直安慰自己拇颅,他們只是感情好奏司,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著樟插,像睡著了一般韵洋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黄锤,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天搪缨,我揣著相機(jī)與錄音,去河邊找鬼鸵熟。 笑死副编,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的流强。 我是一名探鬼主播痹届,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼打月!你這毒婦竟也來(lái)了队腐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奏篙,失蹤者是張志新(化名)和其女友劉穎柴淘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體报破,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悠就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了充易。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗脾。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盹靴,靈堂內(nèi)的尸體忽然破棺而出炸茧,到底是詐尸還是另有隱情瑞妇,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布梭冠,位于F島的核電站辕狰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏控漠。R本人自食惡果不足惜蔓倍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盐捷。 院中可真熱鬧偶翅,春花似錦、人聲如沸碉渡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)滞诺。三九已至形导,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間习霹,已是汗流浹背朵耕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留序愚,地道東北人憔披。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓等限,卻偏偏與公主長(zhǎng)得像爸吮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子望门,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容