天天看點

golang包管理工具

軟體開發中,不可避免的會使用到第三方庫,是以包管理工具可以極大的友善開發者管理第三方依賴,避免掉入“依賴地獄”。

作為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. -------------------------------

作者:warm3snow

出處:http://www.cnblogs.com/informatics/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接配接,否則保留追究法律責任的權利。