Go語言:包管理基礎知識
起因是,遇到一個問題:
經查閱資料,很可能跟包管理有關,之前有了解過忘了就再學一遍順便解決問題。
學習資料:
所謂包管理,比如軟體包管理,方便進行軟體安裝,升級,卸載等一些操作;
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中還需要再設置一遍?很奇怪!