1. 程式人生 > >go-mod 入門

go-mod 入門

Q群有人問go mod 問題,自己也忘了些.順便再整理下.

GO111MODULE可以設定為三個字串值之一:off,on或auto(預設值)。

off 則go命令從不使用新模組支援。它查詢vendor 目錄和$GOPATH以查詢依賴關係;也就是繼續使用“$GOPATH模式”。

on 則go命令需要使用模組,go 會忽略 $GOPATH 和 vendor 資料夾,只根據go.mod下載依賴。

auto 或未設定,則go命令根據當前目錄啟用或禁用模組支援。僅噹噹前目錄位於$GOPATH/src之外並且其本身包含go.mod檔案或位於包含go.mod檔案的目錄下時,才啟用模組支援。

如果需要檢視go module的詳細文件(非常長),可以在控制檯輸入

go help modules

go mod命令

download    download modules to local cache (下載依賴的module到本地cache))
edit        edit go.mod from tools or scripts (編輯go.mod檔案)
graph       print module requirement graph (列印模組依賴圖))
init        initialize new module in current directory (再當前資料夾下初始化一個新的module, 建立go.mod檔案))
tidy        add missing and remove unused modules (增加丟失的module,去掉未用的module)
vendor      make vendored copy of dependencies (將依賴複製到vendor下)
verify      verify dependencies have expected content (校驗依賴)
why         explain why packages or modules are needed (解釋為什麼需要依賴)

初始化mod

go mod init [module]可以建立一個go.mod,只有一行資訊module。

go命令通過查詢當前目錄中的go.mod或者當前目錄的父目錄,或者祖父目錄,依次遞迴查詢。
go.mod檔案可以通過require,replace和exclude語句使用的精確軟體包集。

require語句指定的依賴項模組
replace語句可以替換依賴項模組
exclude語句可以忽略依賴項模組

go mod download

可以下載所需要的依賴,但是依賴並不是下載到$GOPATH中,而是$GOPATH/pkg/mod中,多個專案可以共享快取的module。

在國內訪問 golang.org/x 的各個包都需要FQ,
你可以在go.mod中使用replace替換成github上對應的庫。

replace (
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

go clean -modcache 清除快取

go mod 新東西偶爾還會出現問題 ,這個命令可以嘗試修復,不過執行之前可以考慮備份一下pkg/mod中的包.以防不測.