用 golang 1.11 module 做项目版本管理
go 1.11 有了對模塊的實驗性支持,大部分的子命令都知道如何處理一個模塊,比如?run build install get list mod
子命令,第三方工具可能會支持的晚一些。到 go 1.12 會刪除對?GOPATH
的支持,?go get命令也會變成只能獲取模塊,不能像現在這樣直接獲取一個裸包。
可以用環境變量?GO111MODULE
開啟或關閉模塊支持,它有三個可選值:?off、?on、?auto,默認值是?auto。
- GO111MODULE=off
無模塊支持,go 會從 GOPATH 和 vendor 文件夾尋找包。 - GO111MODULE=on
模塊支持,go 會忽略 GOPATH 和 vendor 文件夾,只根據?go.mod下載依賴。 - GO111MODULE=auto
在?$GOPATH/src外面且根目錄有?go.mod文件時,開啟模塊支持。
在使用模塊的時候,?GOPATH是無意義的,不過它還是會把下載的依賴儲存在?$GOPATH/src/mod
中,也會把?go install的結果放在?$GOPATH/bin中。
定義模塊
模塊根目錄和其子目錄的所有包構成模塊,在根目錄下存在?go.mod文件,子目錄會向著父目錄、爺目錄一直找到?go.mod文件。
模塊路徑指模塊根目錄的導入路徑,也是其他子目錄導入路徑的前綴。?go.mod文件第一行定義了模塊路徑,有了這一行才算作是一個模塊。
go.mod
文件接下來的篇幅用來定義當前模塊的依賴和依賴版本,也可以排除依賴和替換依賴。
這個文件不用手寫,可以用?go mod -init -module example.com/m生成?go.mod的第一行,文件的剩余部分也不用擔心,在執行?go build、?go test、?go list命令時會根據需要的依賴自動生成?require語句。
官方建議經常維護這個文件,保持依賴項是干凈的。對于國內用戶來說,手動維護這個文件是必然的,因為你需要把?golang.org/x/text替換成?github.com/golang/text啊。不需要像以前那樣以 hack 的方式替換?GOPATH中的依賴,我一開始還保持著老思維,居然想要去替換模塊的下載緩存,不過如果用 GOPROXY 功能也確實可以做到替換。
go list 命令
- go list -m
可以查看當前的依賴和版本
go mod 命令
這個子命令用來處理?go.mod文件,上一小節我們已經見過?go mod -init了。
- go mod -fmt
格式化?go.mod文件。 - go mod -sync
從?go.mod刪除不需要的依賴、新增需要的依賴,這個操作不會改變依賴版本。 - go mod -require=path@version
添加依賴或修改依賴版本,這里支持模糊匹配版本號,詳情可以看下文?go get的用法。 - go mod -vendor
生成 vendor 文件夾。
其他的自行?go help mod查看。
go get 命令
獲取依賴的特定版本,用來升級和降級依賴。可以自動修改?go.mod文件,而且依賴的依賴版本號也可能會變。在?go.mod
中使用?exclude排除的包,不能?go get下來。
與以前不同的是,新版?go get可以在末尾加?@符號,用來指定版本。
它要求倉庫必須用?v1.2.0格式打 tag,像?v1.2少個零都不行的,必須是?語義化的、帶?v前綴的版本號。
go get github.com/gorilla/mux # 匹配最新的一個 tag go get github.com/gorilla/mux@latest # 和上面一樣 go get github.com/gorilla/mux@v1.6.2 # 匹配 v1.6.2 go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2 go get github.com/gorilla/mux@c856192 # 匹配 c85619274f5d go get github.com/gorilla/mux@master # 匹配 master 分支latest
匹配最新的 tag。
v1.2.6
完整版本的寫法。
v1、?v1.2
匹配帶這個前綴的最新版本,如果最新版是?1.2.7,它們會匹配?1.2.7。
c856192
版本 hash 前綴、分支名、無語義化的標簽,在?go.mod里都會會使用約定寫法?v0.0.0-20180517173623-c85619274f5d
,也被稱作偽版本。
go get
可以模糊匹配版本號,但?go.mod文件只體現完整的版本號,即?v1.2.0、?v0.0.0-20180517173623-c85619274f5d
,只不過不需要手寫這么長的版本號,用?go get或上文的?go mod -require模糊匹配即可,它會把匹配到的完整版本號寫進?go.mod文件。
go build 命令
go build -getmode=vendor
在開啟模塊支持的情況下,用這個可以退回到使用 vendor 的時代。
總結
以上是生活随笔為你收集整理的用 golang 1.11 module 做项目版本管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支持本地 持久化的 单机版 consul
- 下一篇: 跨域问题的前后端解决方案