起因是,遇到一個問題:
經查閱資料,很可能跟包管理有關,之前有了解過忘了就再學一遍順便解決問題。
學習資料:
所謂包管理,比如軟體包管理,方便進行軟體安裝,升級,解除安裝等一些操作;
Go語言程式中經常會引入其他的package來使用;
Go語言剛開始是並沒有包管理相關功能,實現import <packages>
時:
- 我理解是:早期需要啥包,就手動go get什麼。
go get
命令:會根據路徑,把相應的模組獲取並儲存在$GOPATH/src
。
Go Modules
Go 1.11 引入Go Modules
後:
GO111MODULE = off
:強制使用GOPATH 方式;GO111MODULE = on
:強制使用Go Modules
;GO111MODULE = auto
:- 當存在 go.mod 檔案時或處於 GOPATH 外, 相當於 GO111MODULE=on。
- 相當於 Go 1.13 下你可以將所有的程式碼倉庫均不儲存在 GOPATH 下。
- 當專案目錄處於 $GOPATH 內,且沒有 go.mod 檔案存在時,相當於 GO111MODULE=off。
- 使用
Go Modules
時,在go build
期間使用的包儲存在$GOPATH/pkg/mod
中(而不是GOPATH的$GOPATH/src
中)。 - 執行
go run xxx.go
執行程式碼會發現go mod
會自動查詢依賴自動下載。
到這以後,會考慮到go.mod
這個從哪裡來,是自己手動建立麼?接著學習go mod
;
go mod命令
Go mod
命令是實現Go Modules
的工具;就相當於go get
和GOPATH
的關係;
go mod
命令引數:
圖片來源:go mod使用 - 簡書 (jianshu.com);常用的是
init
,tidy
,edit
初始化一個專案;
go mod init xxx
xxx與package名字無關;只是給當前專案用的模組(modules)一個名字;
go.mod檔案一旦建立後,它的內容將會被go toolchain全面掌控。go toolchain會在各類命令執行時,比如go get、go build、go mod等修改和維護go.mod檔案。
同時還生成了
go.sum
其中包含軟體包的雜湊值,以確保我們具有正確的版本和檔案。
go.mod
提供了module, require、replace和exclude 四個go.mod內的關鍵字:
module
語句指定包的名字(路徑)require
語句指定的依賴項模組replace
語句可以替換依賴項模組exclude
語句可以忽略依賴項模組
解決問題
1 確認GO111MODULE=on
:確認了無數次,不僅zsh裡配置了,bash裡面也配置了;
但用go list
是,依舊出現瞭如下報錯,配置的GO111MOUDLE=on
未生效。
go env -w GO111MODULE=on
這樣之後就好了。
所以我就有一個疑問了,為什麼bash配置檔案中新增的GO111MODULE=on
沒生效?
macos,我只用zsh,zshrc中新增了,也source了;甚至bash_profile,profile也都新增了;為什麼go env中還需要再設定一遍?很奇怪!