Go 語(yǔ)言 go mod 包依賴(lài)管理工具
前文了解了 Go 語(yǔ)言中的包來(lái)復(fù)用代碼,一直以來(lái) Go 語(yǔ)言的包管理都是飽受開(kāi)發(fā)者詬病的一個(gè)軟肋,直到官方推出了 go mod。這個(gè)強(qiáng)大的包管理工具使得我們徹底告別了 Go 語(yǔ)言繁瑣的包管理。本文就來(lái)介紹以下如何使用 go mod 來(lái)進(jìn)行包管理。
Tips:只有在Go11.1之后的版本有這個(gè)工具,在Go語(yǔ)言13.0以后該工具趨于完善。本文的Go版本為13.5,建議使用最新版本的Go語(yǔ)言環(huán)境。
1. 指令介紹
在控制臺(tái)中輸入go mod
指令,會(huì)出來(lái)這個(gè)工具的幫助命令。

指令解析如下表:
指令 | 功能 |
---|---|
go mod download | 下載依賴(lài)包到本地(默認(rèn)下載目錄為 $GOPATH/pkg/mod) |
go mod edit | 編輯 go.mod 文件(不常用) |
go mod graph | 輸出go mod的依賴(lài)圖 |
go mod init | 初始化一個(gè)mod項(xiàng)目,即在包中示創(chuàng)建一個(gè)go.mod文件 |
go mod tidy | 自動(dòng)補(bǔ)全新增(刪除減少)的依賴(lài)包 |
go mod verify | 校驗(yàn)依賴(lài)包 |
go mod why | 解釋為什么要依賴(lài),即顯示這個(gè)包在哪里被導(dǎo)入了(不常用) |
2. 代理配置
go mod 雖然可以直接幫我們下載好我們需要的包,但是因?yàn)?Go 語(yǔ)言很多包都是在國(guó)外的服務(wù)器上,國(guó)內(nèi)下載具有一定的困難。但是不用擔(dān)心,go mod 提供了代理服務(wù),同時(shí)很多國(guó)內(nèi)的云服務(wù)器產(chǎn)商都提供了自己的代理服務(wù):
- 1?
阿里云: https://mirrors.aliyun.com/goproxy
- 2
- 3?
微軟: https://goproxy.io
- 4
- 5?
七牛云: https://goproxy.cn
- 6
- 7
GoCenter: https://gocenter.io
2.1 臨時(shí)配置方案
go mod 代理的臨時(shí)配置方案就是在控制臺(tái)中使用控制臺(tái)對(duì)應(yīng)的環(huán)境變量的修改指令去將?GOPROXY 的值設(shè)置為代理值,以 PowerShell 為例:
- 1?
$env:GOPROXY="https://goproxy.cn"
然后在終端中輸入go env GOPROXY
來(lái)查看修改結(jié)果,若輸出https://goproxy.cn
則為設(shè)置成功。這個(gè)設(shè)置只在當(dāng)前控制臺(tái)有效,重啟控制臺(tái)之后就會(huì)失效。

2.2永久配置方案
Go語(yǔ)言自帶的環(huán)境變量修改指令可以永久修改GOPROXY這個(gè)環(huán)境變量。
Tips:這個(gè)指令只能修改go env中的環(huán)境變量
- 1
go env -w GOPROXY=https://goproxy.cn
然后關(guān)閉終端再打開(kāi),輸入go env GOPROXY
結(jié)果還是會(huì)輸出https://goproxy.cn
。

3. go mod 中使用 replace
replace?是用于使用本地包來(lái)替換導(dǎo)入包的一個(gè)操作,畢竟并不是所有導(dǎo)入包都能夠下載的到,也有一些是你自己開(kāi)發(fā),并未上傳到網(wǎng)絡(luò)中的代碼,這時(shí)候如果要在 go mod 中導(dǎo)入就需要?replace?了。
使用代碼如下:
- 1?
module firstgo
- 2
- 3?
go 1.13
- 4
- 5?
replace (
- 6? ? ? ? ?
//包導(dǎo)入名 => 本地包相對(duì)路徑/絕對(duì)路徑
- 7? ? ? ? ?
firstgo/packagetest1 => ./packagetest1
- 8? ? ? ? ?
firstgo/packagetest2 => ./packagetest2
- 9?
)
4. 在項(xiàng)目中使用
在了解了如何使用 go mod 之后,接下介紹一個(gè)在項(xiàng)目中使用的例子。在任意文件夾中創(chuàng)建Go文件,然后錄入以下代碼:
- 1?
package main
- 2
- 3?
import "github.com/gin-gonic/gin"
- 4
- 5?
func main() {
- 6? ? ? ? ?
r := gin.Default()
- 7? ? ? ? ?
r.GET("/ping", func(c *gin.Context) {
- 8? ? ? ? ? ? ? ? ?
c.JSON(200, gin.H{
- 9? ? ? ? ? ? ? ? ? ? ? ? ?
"message": "Hello Codey!",
- 10? ? ? ? ? ? ? ?
})
- 11? ? ? ?
})
- 12? ? ? ?
r.Run() // listen and serve on 0.0.0.0:8080
- 13?
}
隨后打開(kāi)控制臺(tái),輸入:
- 1?
go mod init
- 2?
go mod tidy
你就會(huì)看到 go mod 會(huì)下載很多相關(guān)依賴(lài)包:

Tips:你們下載的依賴(lài)包可能會(huì)比我多的多,因?yàn)槲抑皇菫榱苏故倦S機(jī)刪了幾個(gè)依賴(lài)包重新下載。
同時(shí)文件夾下多了個(gè) go.mod 和 go.sum ,其中 go.sum 不用在意,其中的內(nèi)容為導(dǎo)入包的路徑、版本和它的hash ,是自動(dòng)生成自動(dòng)更新的。
go.mod 的內(nèi)容為:
- 1?
module firstgo
- 2
- 3?
go 1.13
- 4
- 5?
require github.com/gin-gonic/gin v1.6.3
自動(dòng)記錄了你引用的包路徑和版本。如果要修改使用版本,直接修改版本號(hào)即可。
5. 小結(jié)
本文主要介紹了Go語(yǔ)言的包管理工具 go mod ,以下是其注意事項(xiàng):
- 可以在非?
$GOPATH/src
?的目錄中創(chuàng)建 go mod 項(xiàng)目; - 在下載不到包的情況可以選擇使用代理;
- 在使用本地包時(shí)可以使用 replace。
文章來(lái)源于網(wǎng)絡(luò),侵刪!