溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Golang中的go mod

發(fā)布時(shí)間:2021-11-22 17:37:44 來源:億速云 閱讀:192 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)如何理解Golang中的go mod,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

什么是go.mod

Go.mod是Golang1.11版本新引入的官方包管理工具用于解決之前沒有地方記錄依賴包具體版本的問題,方便依賴包的管理。

Go.mod其實(shí)就是一個(gè)Modules,關(guān)于Modules的官方定義為:

Modules是相關(guān)Go包的集合,是源代碼交換和版本控制的單元。go命令直接支持使用Modules,包括記錄和解析對(duì)其他模塊的依賴性。Modules替換舊的基于GOPATH的方法,來指定使用哪些源文件。

Modules和傳統(tǒng)的GOPATH不同,不需要包含例如src,bin這樣的子目錄,一個(gè)源代碼目錄甚至是空目錄都可以作為Modules,只要其中包含有g(shù)o.mod文件。

如何使用go.mod

  • 首先將go的版本升級(jí)為1.11以上

  • 設(shè)置GO111MODULE

GO111MODULE

GO111MODULE有三個(gè)值:off, on和auto(默認(rèn)值)。

  • GO111MODULE=off,go命令行將不會(huì)支持module功能,尋找依賴包的方式將會(huì)沿用舊版本那種通過vendor目錄或者GOPATH模式來查找。

  • GO111MODULE=on,go命令行會(huì)使用modules,而一點(diǎn)也不會(huì)去GOPATH目錄下查找。

  • GO111MODULE=auto,默認(rèn)值,go命令行將會(huì)根據(jù)當(dāng)前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:當(dāng)前目錄在GOPATH/src之外且該目錄包含go.mod文件;當(dāng)前文件在包含go.mod文件的目錄下面。

go mod命令

golang 提供了 go mod命令來管理包。go mod 有以下命令:

如何理解Golang中的go mod

go.mod如何在項(xiàng)目中使用

首先我們要在GOPATH/src 目錄之外新建工程,或?qū)⒗瞎こ蘡opy到GOPATH/src 目錄之外。

PS:go.mod文件一旦創(chuàng)建后,它的內(nèi)容將會(huì)被go toolchain全面掌控。go toolchain會(huì)在各類命令執(zhí)行時(shí),比如go get、go build、go mod等修改和維護(hù)go.mod文件。

go.mod 提供了modulerequirereplaceexclude四個(gè)命令

  • module語句指定包的名字(路徑)

  • require語句指定的依賴項(xiàng)模塊

  • replace語句可以替換依賴項(xiàng)模塊

  • exclude語句可以忽略依賴項(xiàng)模塊

下面是我們建立了一個(gè)hello.go的文件:

package main
 
import (
	"fmt"
)
 
func main() {
    fmt.Println("Hello, world!")
}

其次,在當(dāng)前目錄下,命令行運(yùn)行 go mod init + 模塊名稱 初始化模塊

即go mod init hello

運(yùn)行完之后,會(huì)在當(dāng)前目錄下生成一個(gè)go.mod文件,這是一個(gè)關(guān)鍵文件,之后的包的管理都是通過這個(gè)文件管理。

官方說明:除了go.mod之外,go命令還維護(hù)一個(gè)名為go.sum的文件,其中包含特定模塊版本內(nèi)容的預(yù)期加密哈希 
go命令使用go.sum文件確保這些模塊的未來下載檢索與第一次下載相同的位,以確保項(xiàng)目所依賴的模塊不會(huì)出現(xiàn)意外更改,無論是出于惡意、意外還是其他原因。 go.mod和go.sum都應(yīng)檢入版本控制。 
go.sum 不需要手工維護(hù),所以可以不用太關(guān)注。

注意:子目錄里是不需要init的,所有的子目錄里的依賴都會(huì)組織在根目錄的go.mod文件里

接下來,讓我們的項(xiàng)目引進(jìn)一下第三方包

如修改hello.go文件如下,按照過去的做法,要運(yùn)行hello.go需要執(zhí)行go get 命令 下載gorose包到 $GOPATH/src。

package main
 
import (
	"fmt"
	"github.com/gohouse/gorose"
)
 
func main() {
    fmt.Println("Hello, world!")
}

但是,使用了新的包管理就不在需要這樣做了

直接 go run hello.go

稍等片刻… go 會(huì)自動(dòng)查找代碼中的包,下載依賴包,并且把具體的依賴關(guān)系和版本寫入到go.mod和go.sum文件中,當(dāng)然go會(huì)報(bào)一個(gè)引用但未真正使用的錯(cuò)誤。
查看go.mod,它會(huì)變成這樣:

module test
 
require (
	github.com/gohouse/gorose v1.0.5
)

require 關(guān)鍵字是引用,后面是包,最后v1.11.1 是引用的版本號(hào)

這樣,一個(gè)使用Go包管理方式創(chuàng)建項(xiàng)目的小例子就完成了。

以上就是如何理解Golang中的go mod,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI