軟件開發中,不可避免的會使用到第三方庫,因此包管理工具可以極大的方便開發者管理第三方依賴,避免掉入“依賴地獄”。
作為google強大背書的golang語言,golang官方包管理工具終於“千呼萬喚始出來”。 下面我們就來介紹一下golang的包管理工具
golang包管理工具
安裝
go module是go語言內置的包管理工具,安裝好go就可以使用
要求: go version >= 1.11
命令詳細說明如下:
$ go mod
Go mod provides access to operations on modules.
Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.
Usage:
go mod <command> [arguments]
The commands are:
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
Use "go help mod <command>" for more information about a command.
設置環境變量:GO111MODULE
- 可在 /etc/profile 或 ~/.bash_profile 下添加 'GO111MODULE=on', 永久生效(新打開終端)
- 或在單個工程根目錄下,在終端下輸入 'export GO111MODULE=on',臨時生效(本終端)
注:modules 功能啟用時,依賴包的存放位置變更為$GOPATH/pkg,允許同一個package多個版本並存,並且是文件權限是只讀的 -r--r--r--,且多個項目可以共享緩存的 module
操作手冊
初始化,並下載依賴
進入到當前工程的目錄下
$ go mod init github.com/USERNAME/myRepo #生成go.mod文件(項目中只需要執行一次)
$ go mod tidy #下載依賴包
$ go mod verify #驗證(optional)
vendor模式
執行go mod vendor
,會在項目下生成新的vendor目錄,並把項目依賴下載到vendor中,(在go mod
誕生之前,相信大家都比較熟悉govendor
,這里不在贅述)
此時vendor里的依賴只有項目中被使用的文件(例如:未被引用的子目錄 、*_test.go等不會被包含)
golang第三方包源
牆外有很多優秀的資源, 比如golang.org上的第三方包,可以通過以下兩種方式來下載
代理goproxy
設置golang環境變量GOPROXY
export GOPROXY=http://goproxy.io (官方維護,香港節點,該地址可穩定訪問)
export GOPROXY=http://mirrors.aliyun.com/goproxy/ (該地址速度快,但有些包版本無法獲取)
export GOPROXY=https://athens.azurefd.net (微軟cdn節點,也很穩定,快速) 推薦
export GOPROXY=https://gocenter.io
注:上述golang源選擇其一即可。如果你使用的 Go version>=1.13
, 可以通過設置 GOPRIVATE 環境變量來控制哪些私有倉庫和依賴(公司內部倉庫)不通過proxy來拉取,直接走本地,設置如下:
go env -w GOPROXY=https://goproxy.io,direct
go env -w GOPRIVATE=*.corp.example.com # 設置不走 proxy 的私有倉庫,多個用逗號相隔
地址替換replace
go mod提供了replace
來解決國內開發者無法訪問牆外資源的痛苦。具體方法如下:
編輯go.mod
文件,在文件末尾添加下面這些被牆的包,執行go mod tidy
下載。下面整理了一下經常需要的包~
replace golang.org/x/net => github.com/golang/net latest
replace golang.org/x/tools => github.com/golang/tools latest
replace golang.org/x/crypto => github.com/golang/crypto latest
replace golang.org/x/sys => github.com/golang/sys latest
replace golang.org/x/text => github.com/golang/text latest
replace golang.org/x/sync => github.com/golang/sync latest
replace golang.org/x/exp => github.com/golang/exp latest
replace golang.org/x/lint => github.com/golang/lint latest
replace golang.org/x/oauth2 => github.com/golang/oauth2 latest
replace golang.org/x/time => github.com/golang/time latest
replace golang.org/x/image => github.com/golang/image latest
replace golang.org/x/mobile => github.com/golang/mobile latest
replace cloud.google.com/go => github.com/googleapis/google-cloud-go latest
replace google.golang.org/grpc => github.com/grpc/grpc-go latest
replace google.golang.org/appengine => github.com/golang/appengine latest
replace google.golang.org/genproto => github.com/googleapis/go-genproto latest
replace google.golang.org/api => github.com/googleapis/google-api-go-client latest
使用自己的私有包
問題1
cannot load xxx: cannot find module providing package xxx
解決方法:xxx是私有包,私有包如果不想發布到網上,需要手動添加require ,然后replace 進行替換,將私有包指向本地module所在的絕對或相對路徑。
一般用相對路徑更通用。
手動修改go.mod 添加xxx的require和replace
require (
xxx v0.0.0
)
replace xxx v0.0.0 => ./xxx
再度運行go test 命令,發現仍有失敗提示如下,找不到xxx文件夾下的go.mod文件。
問題2:
go: parsing xxx\go.mod: open xxx\go.mod: The system cannot find the file specified.
go: error loading module requirements
解決方法:xxx庫也需要使用Module管理,為私有包xxx也生成mod文件。運行如下命令:
cd xxx;
go mod init xxx
xxx文件夾下的go.mod文件如下:
module dbredis
go 1.12
okay~
---------------------------Go:simple is better. -------------------------------