最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go1.18?新特性之多模塊Multi-Module工作區(qū)模式

 更新時間:2022年04月11日 10:28:24   作者:西京刀客  
這篇文章主要介紹了Go1.18?新特性之多模塊Multi-Module工作區(qū)模式,在 Go 1.18之前,建議使用依賴模塊中的 replace 指令來處理這個問題,從 Go 1.18開始引入了一種同時處理多個模塊的新方法,通過案例給大家詳細(xì)介紹,感興趣的朋友一起看看吧

背景

在 go 中使用多個模塊可能真的是一件苦差事。特別是當(dāng)您的一個模塊依賴于另一個模塊時,您需要同時編輯這兩個模塊!

您編輯父模塊,但是然后您需要將其推送到repo。然后在依賴模塊中運(yùn)行 update 以下載新版本。最終使用2行修復(fù)您需要的。至少可以說是一種痛苦。

在 Go 1.18之前,建議使用依賴模塊中的 replace 指令來處理這個問題。

這個方法是有效的,但也有自己的問題,比如需要手動編輯 go.mod,確保你提交代碼時候,不commit 這個 replace等等。

最后,從 Go 1.18開始,引入了一種同時處理多個模塊的新方法,這種方法消除了這些問題: go.work。

Multi-Module, Single Workspace
https://medium.com/@michael_epps/multi-module-single-workspace-3493528555ad

舉例:未發(fā)布的 module

在做本地的 Go 項目開發(fā)時,可能會在本地同時開發(fā)多個庫(項目庫、工具庫、第三方庫)等。

如下代碼:

package main
 
import (
    "github.com/eddycjy/pkgutil"
)
 
func main() {
    pkgutil.PrintFish()
}

我們看到:該代碼對外唯一的依賴是module path為"github.com/eddycjy/pkgutil"的module,但后者是一個尚在本地進(jìn)行開發(fā),還未發(fā)布到http://github.com上的module。

如果這個時候運(yùn)行 go run 或是 go mod tidy,都不行,會運(yùn)行失敗。
報如下類似錯誤:

fatal: repository 'https://github.com/eddycjy/pkgutil/' not found

這個問題報錯是因為 github.com/eddycjy/pkgutil 這個庫,在 GitHub 是沒有的,自然也就拉取不到。

因此,許多同學(xué)會發(fā)出靈魂質(zhì)疑:Go 的依賴都必須要上傳到 GitHub 嗎,強(qiáng)綁定?

解決方法:在 Go1.18 以前,我們會通過 replace,又或是直接上傳到 Github 上,自然也就能被 Go 工具鏈拉取到依賴了。

用replace指示符將該版本指向本地的module的開發(fā)目錄。

Go1.18 新特性:多模塊(Multi-Module)工作區(qū)模式

2022 年 3 月 15 日 go 1.18 正式發(fā)布,新版本除了對性能的提升之外,還引入了很多新功能,其中就有 go 期盼已久的功能泛型(Generics),同時還引入的多模塊工作區(qū)(Workspaces)和模糊測試(Fuzzing)。

彌補(bǔ)了當(dāng)前go module構(gòu)建模式的一些不足,堪稱是go module構(gòu)建模式的最后一塊拼圖。

Go 多模塊工作區(qū)能夠使開發(fā)者能夠更容易地同時處理多個模塊的工作,如:

  • 方便進(jìn)行依賴的代碼調(diào)試(打斷點、修改代碼)、排查依賴代碼 bug
  • 方便同時進(jìn)行多個倉庫/模塊并行開發(fā)調(diào)試

go 使用的是多模塊工作區(qū),可以讓開發(fā)者更容易同時處理多個模塊的開發(fā)。在 Go 1.17 之前,只能使用 go.mod replace 指令來實現(xiàn),如果你正巧是同時進(jìn)行多個模塊的開發(fā),使用它可能是很痛苦的。每次當(dāng)你想要提交代碼的時候,都不得不刪除掉 go.mod 中的 replace 才能使模塊穩(wěn)定的發(fā)布版本。

Go1.18 工作區(qū)模式

在社區(qū)的多輪反饋下,Michael Matloob 提出了提案《Proposal: Multi-Module Workspaces in cmd/go[1]》進(jìn)行了大量的討論和實施,在 Go1.18 正式落地。

新提案的一個核心概念,就是增加了 go work 工作區(qū)的概念,針對的是 Go Module 的依賴管理模式。

這個提案引入一個go.work文件用于開啟Go工作區(qū)模式。go.work通過directory指示符設(shè)置一些本地路徑,這些路徑下的go module構(gòu)成一個工作區(qū)(workspace),Go命令可以操作這些路徑下的go module,也會優(yōu)先使用工作區(qū)中的go module。

其能夠在本地項目的 go.work 文件中,通過設(shè)置一系列依賴的模塊本地路徑,再將路徑下的模塊組成一個當(dāng)前 Go 工程的工作區(qū),也就是 N 個 Go Module 組成 1 個 Go Work, 工作區(qū)的讀取優(yōu)先級是最高的。

總結(jié): 當(dāng)你的本地有很多module,且這些module存在相互依賴,那么我們可以在這些module的外面建立一個Go工作區(qū),基于這個Go工作區(qū)開發(fā)與調(diào)試這些module就變得十分方便。

初始化一個新的工作區(qū)

只要執(zhí)行 go work init 就可以初始化一個新的工作區(qū),后面跟的參數(shù)就是要生成的具體子模塊 mod。

命令如下:

go work init ./mod ./tools

項目目錄如下:

awesomeProject
├── mod
│   ├── go.mod      // 子模塊
│   └── main.go
├── go.work         // 工作區(qū)
└── tools
    ├── fish.go
    └── go.mod      // 子模塊
go work 支持命令
  • 通常情況下,建議不要提交 go.work 文件到 git 上,因為它主要用于本地代碼開發(fā)。
  • 推薦在: $GOPATH 路徑下執(zhí)行,生成 go.work 文件
  • go work init 初始化工作區(qū)文件,用于生成 go.work 工作區(qū)文件

初始化并寫入一個新的 go.work 到當(dāng)前路徑下,可以指定需要添加的代碼模塊
示例: go work init ./hello 將本地倉庫 hello 添加到工作區(qū)
hello 倉庫必須是 go mod 依賴管理的倉庫(./hello/go.mod 文件必須存在)

go work use 添加新的模塊到工作區(qū)

use 指定使用的模塊目錄

命令示例:

go work use ./example 添加一個模塊到工作區(qū)

命令示例:

go work use ./example 添加一個模塊到工作區(qū)
go work use ./example ./example1 添加多個模塊到工作區(qū)
go work use -r ./example 遞歸 ./example 目錄到當(dāng)前工作區(qū)
刪除命令使用 go work edit -dropuse=./example 功能

可以使用 go work use hello 添加模塊,也可以手動修改 go.work 工作區(qū)添加新的模塊
在工作區(qū)中添加了模塊路徑,編譯的時候會自動使用 use 中的本地代碼進(jìn)行代碼編譯,和 replaces 功能類似。

# 單模塊結(jié)構(gòu)
use ./hello
# 多模塊結(jié)構(gòu)
use (
    ./hello
    ./example
)
go work edit 用于編輯 go.work 文件

go work edit 用于編輯 go.work 文件
可以使用 edit 命令編輯和手動編輯 go.work 文件效果是相同的
示例:

go work edit -fmt go.work 重新格式化 go.work 文件
go work edit -replace=github.com/link1st/example=./example go.work 替換代碼模塊
go work edit -dropreplace=github.com/link1st/example 刪除替換代碼模塊
go work edit -use=./example go.work 添加新的模塊到工作區(qū)
go work edit -dropuse=./example go.work 從工作區(qū)中刪除模塊
go work sync 將工作區(qū)的構(gòu)建列表同步到工作區(qū)的模塊

go env GOWORK

查看環(huán)境變量,查看當(dāng)前工作區(qū)文件路徑
可以排查工作區(qū)文件是否設(shè)置正確,go.work 路徑找不到可以使用 GOWORK 指定

go.work 文件結(jié)構(gòu)

文件結(jié)構(gòu)和 go.mod 文件結(jié)構(gòu)類似,支持 Go 版本號、指定工作區(qū)和需要替換的倉庫
文件結(jié)構(gòu)示例:

go 1.18

use (
    ./hello
    ./example
)

replace (
    github.com/link1st/example => ./example1
)

replaces 替換依賴倉庫地址
replaces 命令與 go.mod 指令相同,用于替換項目中依賴的倉庫地址
需要注意的是 replaces 和 use 不能同時指定相同的本地路徑

錯誤示例
同時在 use 和 replace 指定相同的本地路徑

go 1.18

use (
    ./hello
    ./example
)

replace (
    github.com/link1st/example => ./example
)

go.work 文件優(yōu)先級高于 go.mod 中定義在

同時使用 go.work 和 go.mod replace 功能的的時候分別指定不同的代碼倉庫路徑,go.work 優(yōu)先級高于 go.mod 中定義

如何禁用工作區(qū)

Go 全局變量 GOWORK 設(shè)置 off 則可以禁用工作區(qū)功能

export GOWORK=off

到此這篇關(guān)于Go1.18 新特性之多模塊Multi-Module工作區(qū)模式的文章就介紹到這了,更多相關(guān)Go多模塊工作區(qū)模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang設(shè)計模式之單例模式詳細(xì)講解

    Golang設(shè)計模式之單例模式詳細(xì)講解

    單例模式很容易記住。就像名稱一樣,它只能提供對象的單一實例,保證一個類只有一個實例,并提供一個全局訪問該實例的方法。本文就來聊聊Go語言中的單例模式,感興趣的小伙伴可以了解一下
    2023-01-01
  • 深入理解Go Gin框架中間件的實現(xiàn)原理

    深入理解Go Gin框架中間件的實現(xiàn)原理

    在Go Gin框架中,中間件是一種在請求處理過程中插入的功能模塊,它可以用于處理請求的前置和后置邏輯,例如認(rèn)證、日志記錄、錯誤處理等,本文將給大家介紹一下Go Gin框架中間件的實現(xiàn)原理,需要的朋友可以參考下
    2023-09-09
  • Golang實現(xiàn)SSH、SFTP操作小結(jié)

    Golang實現(xiàn)SSH、SFTP操作小結(jié)

    在日常的一些開發(fā)場景中,我們需要去和遠(yuǎn)程服務(wù)器進(jìn)行一些通信,本文主要介紹了Golang實現(xiàn)SSH、SFTP操作小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • 一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途

    一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途

    Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計,它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時以及如何有效地使用它們
    2023-10-10
  • go語言如何導(dǎo)入和使用包示例詳解

    go語言如何導(dǎo)入和使用包示例詳解

    這篇文章主要為大家介紹了go語言如何導(dǎo)入和使用包示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 淺析Go語言中閉包的使用

    淺析Go語言中閉包的使用

    閉包是一個函數(shù)和其相關(guān)的引用環(huán)境組合的一個整體。本文主要為大家介紹一下Go語言中閉包的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-12-12
  • 圖解Golang的GC垃圾回收算法

    圖解Golang的GC垃圾回收算法

    這篇文章主要介紹了圖解Golang的GC垃圾回收算法,詳細(xì)的介紹了三種經(jīng)典的算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Go 容器遍歷的實現(xiàn)示例

    Go 容器遍歷的實現(xiàn)示例

    Go 語言提供的基礎(chǔ)容器,免不了要查詢?nèi)萜髦械臄?shù)據(jù),那么是如何實現(xiàn)遍歷的呢?本文將會介紹幾種常用容易的遍歷及其使用。感興趣的可以了解一下
    2021-06-06
  • Go基礎(chǔ)教程系列之defer、panic和recover詳解

    Go基礎(chǔ)教程系列之defer、panic和recover詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之defer、panic和recover,需要的朋友可以參考下
    2022-04-04
  • Go語言內(nèi)置包的使用

    Go語言內(nèi)置包的使用

    本文主要介紹了Go語言內(nèi)置包的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

新营市| 上饶市| 沙河市| 珲春市| 札达县| 千阳县| 旌德县| 繁昌县| 西华县| 咸宁市| 荔波县| 怀集县| 拉萨市| 阿拉善左旗| 黄浦区| 怀仁县| 尉犁县| 乌恰县| 巴南区| 威远县| 南召县| 柳州市| 溧阳市| 额尔古纳市| 澎湖县| 崇义县| 巴林左旗| 天峻县| 岑溪市| 韶山市| 河津市| 惠东县| 淳安县| 通州市| 丹江口市| 叶城县| 鸡东县| 宣汉县| 图们市| 乡宁县| 和静县|