什么是go mod
go mod 是go語言的包管理工具,類似java 的maven,go mod的出現可以告別goPath,使用go module來管理項目,有了go mod賬號就不需要非得把項目放到gopath/src目錄下了,你可以在磁盤的任何位置新建一個項目
go mod在go語言的1.11版本后推出,但是在早期,go mod 非常難用,被廣大的開發者所詬病;現在已經好了很多了
常用命令
通過命令go mod help
可以看到有go mod有以下幾個命令
download
:下載module到本地緩存,下載到GOMODCACHE指定的路徑edit
: 編輯graph
:以文本形式打印模塊需求圖init
:創建go mod 項目tidy
添加缺失module,或者去除沒有使用的modulevendor
將項目的依賴庫下載到項目內部,作為項目的一部分來編譯。verify
驗證依賴是否正確why
explain why packages or modules are needed
下載依賴 go get
方式
go get命令會下載指定的包,并將下載的包進行編譯,然后安裝到特定目錄。
go get github.com/go-redis/redis
除此之外,go get還提供以下幾個參數
-d
:只下載不安裝-f
:只有在你包含了 -u 參數的時候才有效,不讓 -u 去驗證 import 中的每一個都已經獲取了,這對于本地 fork 的包特別有用-t
:同時也下載需要為運行測試所需要的包-u
:強制使用網絡去更新包和它的依賴包-v
:顯示執行的命令
下載依賴 go.mod
方式
在mod文件中添加 require(依賴鏈接 版本號)
即可,示例:
module demo_94_tailgo 1.17require (github.com/hpcloud/tail v1.0.0 // indirect
)
添加完成后在執行以下命令即可將依賴下載到本地
go mod download
查看go mod狀態
go env
找到以下的配置項就是go mod的配置,為什么叫 GO111MODULE 呢,中間的111是因為從1.11版本后推出的功能,
set GO111MODULE=on
設置代理
默認的代理是GOPROXY=https://proxy.golang.org,direct
,但是這個鏈接是國外的網站,得翻墻才能用,所以我們用國內的代理
go env -w GOPROXY=https://goproxy.cn,direct
開啟/關閉go mod
GO111MODULE 有三種狀態
- on : 開啟
- off : 關閉
- auto :默認值,go命令會根據當前目錄來決定是否啟用module功能
開啟 go mod
go env -w GO111MODULE=on
關閉 go mod
go env -w GO111MODULE=off
download 下載
下載module到本地緩存,下載到GOMODCACHE
指定的路徑,可通過go env -w GOMODCACHE=/xxx/xxx
修改cache路徑
go mod download
edit 編輯go.mod文件
# -replace 表示 包下載不下來的時候使用,--replace=新地址=下載不下來的地址
go mod edit -replace golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest# -exclude 表示排除某個包
go mod edit -exclude golang.org/x/crypto@v0.0.0# -require 表示導入某個包
go mod edit -require golang.org/x/crypto@v0.0.0# -json 以json方式打印go.mod 模塊對象
go mod edit -json
graph
以文本形式打印模塊需求圖
go mod graph
init 創建go mod 項目
進入項目目錄下,執行以下命令,其中projectName
是你的項目名稱, 建議和目錄一致
go mod init projectName
執行完后會自動創建一個go.mod的文件,內容如下
module xx.xx.com/xd/projectNamego 1.14
tidy
添加缺失module,或者去除沒有使用的module
go mod tidy
vendor
將項目的依賴庫下載到項目內部,作為項目的一部分來編譯。此時會生產一個vendor的目錄,一般情況下都用不上
go mod vendor
verify
驗證依賴是否正確
go mod verify
why
查找依賴
go mod why
打包編譯
go build 編譯
go build命令會編譯包及其依賴,生成的文件存放在當前目錄下。而且go build只對main包有效,其他包不起作用
go build
go install 編譯并安裝
和go build命令比較相似,go install對于非main包會生成靜態文件放在GOPATH/pkg目錄下,文件擴展名為a。如果為main包,則會在GOPATH/pkg目錄下,文件擴展名為a。如果為main包,則會在GOPATH/pkg目錄下,文件擴展名為a。如果為main包,則會在GOPATH/bin下生成一個和給定包名相同的可執行二進制文件。
go install
go build 、go install、go get 區別
go build
: go build命令是在當前目錄編譯生成可執行文件,注意 go build 指令會調用所有引用包的源碼進行重新編譯而不是使用之前pkg里的文件go install
: 執行 go install 命令會完成類似 go build 的功能 ,但go install 命令執行生成的可執行文件是在【$GOPATH/bin】目錄中go get
: 該命令可以理解為兩個操作 git clone + go install , 執行會將遠程代碼clone 到【$GOPATH/src】 目錄中