自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

快速掌握 Go 工作區(qū)模式

開發(fā) 前端
今天我們快速了解了 Go 工作區(qū)模式(workspace mode)的背景、使用、場景。這對于解決項目中多模塊依賴有著一定的作用,可以不再需要去 go.mod 里 replace,算是給了一個規(guī)范化的解決方案。

大家好,我是煎魚。

在 Go 項目的模塊管理中,先是 GOPATH,然后到廢棄。再到強推 Go modules,從被社區(qū)抗拒到 rsc 硬上弓?,F(xiàn)在最新要了解的,就是工作區(qū)模式(workspace mode)。這是一個在 Go1.18 引入的重要特性。

之前一直沒提過,今天補全這塊的知識點。

背景

在 Go1.11 起有了 Go modules 后,看起來 Go 模塊管理逐步按序有了約束、規(guī)范了起來。但也帶來了一些使用上的問題。

現(xiàn)實開發(fā)時,當(dāng)我們需要對多個關(guān)聯(lián)模塊進行開發(fā)(修改)時,這個事情就麻煩了起來。我見過兩種方式。

1、第一種:直接在 go.mod 文件上配置 replace,配置到本地的開發(fā)目錄。這是最常見的方式。

// go.mod

replace example.com/golang/text => "../eddycjy/golang/text"

這種做法經(jīng)常會有人不小心提交到 Git 倉庫上。還挺折騰人的,一個不小心就為此 debug 了半天,或者發(fā)布部署一直卡著過不去。

2、第二種:直接在依賴模塊上編碼,編碼到一定的程度。才上傳 GitHub/GitLab。再去發(fā)布版本標(biāo)簽再引用。這種用法比較少,只有模塊比較簡單且對程序比較自信的會這么干。(不推薦)

總的來講,就是有了 Go modules 后,多模塊間的依賴開發(fā)還是挺麻煩的。要經(jīng)常 replace,有時候又會忘了刪。

go work 指令集

在大家痛苦了許久后,Go1.18 時終于發(fā)布了工作區(qū)模式的方式,來優(yōu)化這個用法和問題。

以下是 go work 的指令集:

go work <command> [arguments]
  • edit:從工具或腳本中編輯 go.work。
  • init:初始化工作區(qū)文件(go.work)。
  • sync:將工作區(qū)構(gòu)建列表同步到模塊。
  • use:將模塊添加到工作區(qū)文件。

快速使用

接下來我們快速應(yīng)用 Go 工作區(qū)模式,讓大家有個直觀的了解。

需要注意,該特性需要確保 Go 版本 >= 1.18。

創(chuàng)建工作區(qū)

首先我們創(chuàng)建一個工作區(qū),執(zhí)行如下命令:

$ mkdir workspace-main && cd workspace-main 
$ go work init

執(zhí)行完畢后會在該目錄下創(chuàng)建一個 go.work 文件,文件內(nèi)容包含:

go 1.20

僅包含版本信息,因為當(dāng)前是空白的工作區(qū),只有初始化行為。

創(chuàng)建演示模塊

$ mkdir hello-world && cd hello-world
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello

寫入代碼 hello.go:

package main

import (
 "fmt"

 "golang.org/x/example/hello/reverse"
)

func main() {
 fmt.Println(reverse.String("Hello, 煎魚"))
}

如果你這時候直接 go run??赡軙霈F(xiàn)如下報錯:

hello.go:6:5: no required module provides package golang.org/x/example/hello/reverse: go.mod file not found in current directory or any parent directory; see 'go help modules'

看著非常迷惑人,很多同學(xué)以為是環(huán)境變量 GO111MODULE 沒有設(shè)置為 on。其實是沒有將本模塊加入工作區(qū)中,導(dǎo)致運行錯誤。

所以可以看出來,在設(shè)計上是先有項目,再有工作區(qū)的路徑。也是相對符合的。

這時候需要回到工作區(qū)目錄 workspace-main。執(zhí)行如下命令:

go work use ./hello-world

go.work 文件內(nèi)會變成:

$ cat go.work 
go 1.20

use ./hello-world

再運行程序:

$ go run hello-world/hello.go 
魚煎 ,olleH

一切正常。

創(chuàng)建需修改的模塊

這時候我們有了一個實際的訴求,我們希望 golang.org/x/example/hello 改一下這個 SDK 庫。

如果是以前的話,我們需要寫 replace 來解決?,F(xiàn)在的話可以用工作區(qū)模式來完成這個訴求。

我們先需要回到工作區(qū)根目錄 workspace-main 下,拉取這個 SDK 庫到工作區(qū)中:

git clone https://go.googlesource.com/example

再將其引入項目的工作區(qū)中:

go work use ./example/hello

go.work 文件會變成:

go 1.20

use (
 ./example/hello
 ./hello-world
)

這里需要注意,go work 以 go.mod 為單位。如果你直接引入 ./example。是無法對 ./example/hello 的 module 起效果的。

在引入成功后,我們回到 ./example/hello 目錄下的 reverse.go 文件,新增一個用于 Demo 的方法:

...
func Hello() string {
 return "煎魚,你好!"
}

再到 hello 項目中,新增調(diào)用:

package main

import (
 "fmt"

 "golang.org/x/example/hello/reverse"
)

func main() {
 fmt.Println(reverse.String("Hello, 煎魚"))
 fmt.Println(reverse.Hello())
}

輸出結(jié)果:

魚煎 ,olleH
煎魚,你好

一切正常。滿足不添加 replace 的要求,也使用了 go.work,不用擔(dān)心把 replace 不小心提交到 Git 倉庫中。

另外 Go 工作區(qū)中的項目在進行編譯時,也是引用所配置好的工作區(qū)內(nèi)的模塊。而不是單單只針對開發(fā)階段的 go run,也可以在產(chǎn)線上去使用,編譯成二進制去應(yīng)用和部署。

場景匯總

我們已經(jīng)對 Go 的工作區(qū)模式有了一定的了解,其使用場景聚焦在如下:

  • 開發(fā)較大的產(chǎn)品,其項目存在著多個互相依賴的模塊??梢灾苯釉O(shè)置成一個工作區(qū)。
  • 開發(fā)第三方庫(類似 SDK 庫),需要對上游的模塊新增新特性。勢必要在本地模塊先引用做開發(fā)、測試、驗證。也可以直接使用工作區(qū)。

總結(jié)

今天我們快速了解了 Go 工作區(qū)模式(workspace mode)的背景、使用、場景。這對于解決項目中多模塊依賴有著一定的作用,可以不再需要去 go.mod 里 replace,算是給了一個規(guī)范化的解決方案。

但在實際應(yīng)用中,我們會發(fā)現(xiàn)工作區(qū)模式的便利度,其實不太高??赡芤蕾嚹K數(shù)量少時,還不如 replace 一把梭來得快。

另外目前階段的使用宣傳還是做得比較弱的,前兩天問了一圈,還真有一些同學(xué)不知道,也沒有用過的。

責(zé)任編輯:武曉燕 來源: 腦子進煎魚了
相關(guān)推薦

2022-01-19 08:51:00

Module工作區(qū)Go

2023-04-26 08:43:28

GoCGO語言

2022-11-27 23:37:34

Go模式Workspaces

2022-07-12 06:17:43

GoogleGolang開發(fā)工作

2019-12-24 16:52:22

Go語言騰訊TM函數(shù)

2023-03-27 09:40:01

GoWebAssembl集成

2024-10-30 09:50:51

WebGo語言

2010-06-21 15:33:47

路由信息協(xié)議

2023-05-04 08:47:31

命令模式抽象接口

2023-04-10 09:20:13

設(shè)計模式訪客模式

2009-12-11 16:39:08

PHP引號轉(zhuǎn)義

2009-12-08 15:48:19

PHP文章分頁

2009-11-18 14:53:40

Oracle參數(shù)設(shè)置

2017-08-07 15:19:30

編程語言快速

2009-12-23 10:20:27

WPF類層次

2009-11-09 15:06:34

WCF序列化

2023-05-15 08:51:46

解釋器模式定義

2010-09-01 15:37:04

DHCP工作過程

2022-03-25 21:57:49

匯編Go語言

2021-09-29 18:17:30

Go泛型語言
點贊
收藏

51CTO技術(shù)棧公眾號