此项目与visual studio的当前版本不兼容_忘掉GOPATH,迎接Go modules,进入Go项目依赖库版本管理新时代...
Go SDK 1.13測試版已經發布了。從此版本開始,Go modules依賴庫版本管理特性將正式開始推薦使用。本文將解釋一些和Go modules相關的一些命令和概念。
Module(模塊)定義為一些Go代碼包的集合。通常體現為一個含有若干代碼包的目錄。每個模塊可以發布一系列版本。版本號使用semver(語義化版本 https://semver.org/lang/zh-CN/ )表示。一個模塊可能依賴于其它若干模塊;準確說來,是依賴于其它若干模塊的各自的某個具體版本。每個模塊可以在自己的根目錄下的go.mod文件中指定其所依賴的各個模塊的具體版本。
如果你所維護的某個模塊尚未使用Go modules管理依賴,你可以打開一個命令行終端,進入此模塊根目錄,運行下面這條命令將此模塊轉換為一個使用Go modules管理依賴的模塊。
go mod init host.prefex/mypkg其中,host.prefex/mypkg為其它包引入此模塊中的包時的引入路徑的前綴。常常地,host.prefex為github.com等源代碼托管網站;mypkg常為 user/project 這種形式。當然,你也可以將你自己的域名 my.website 用做引入路徑的前綴(host.prefex)。但是這時如果不能從引入路徑my.website/mypkg 中判斷出此代碼包使用何種源代碼版本管理工具(比如git/hg/svn等),則my.website網站必須響應 https://my.website/mypkg?go-get=1 HTTPS請求(HTTP也可以但不推薦),并在在HTML的返回體中的<head>部分包含一個<meta>標簽來指名具體到哪里下載此模塊。(本博將另開一篇文章詳解自定義域名引入路徑。)
當go.mod文件已經創建出來之后,我們可以在此文件中手動指定此模塊所要依賴的其它模塊和這些以來模塊的版本號(版本號必須制定但可以使用偽版本號,比如 <v1.12.3、>=v1.5.6、latest和分支名master等)。我們也可以運行go build和go test等命令來自動發現并且在go.mod文件中加入依賴模塊和它們的具體版本。手動指定的偽模塊版本號將被go build等命令更改為確切的版本號。其中
- latest偽版本號將被解讀為最新正式發布版本,正式發布版本是標號為形如vX.Y.Z的語義化版本(semver,`X`/`Y`/`Z`均為整數數字)。
- 分支名偽版本號將被解讀為指定分支的最新提交。
- 而 <v1.12.3 將被解讀為v1.12系列版中最大的小于v1.12.3的版本。
當使用源代碼版本管理工具時,一個tag的名稱將被視為一個版本號。形如 v1.2.3-pre1 的預發布版本不屬于正式版本。(關于模塊的版本匹配規則,本博將另發一篇文章詳述。)
go build等命令將下載并緩存尚未緩存的依賴模塊的版本代碼。
在一個模塊目錄下運行 go get a.b.c/x/y@v1.2.3 將在此模塊的go.mod文件中加入一個依賴。
默認情況下,go build等命令將訪問sumdb(Checksum Database,默認值為 https://sum.golang.org/ )驗證下載的各個直接或者間接依賴模塊的哈希值是否和sumdb中記錄的哈希值相匹配。如果不匹配,很可能某些環節出了問題(比如下載的模塊代碼被人惡意更改了)。
一般說來,go.mod文件中只記錄當前模塊的直接依賴。每個依賴體現為一條require或者replace指令。比如
module my.website/cmd/myprogramrequire github.com/boltdb/bolt v1.3.0replace my.website/mypkg github.com/myname/myproject v1.0.0其中的 replace 指令表示,當遇到引入路徑前綴為 my.website/mypkg 的代碼包時,真實的下載的代碼包為處于路徑 github.com/myname/myproject 的v1.0.0版本的模塊下的相應代碼包。
如果你的一個舊項目是使用其它流行第三方工具(比如deps和glide等)來管理包依賴的,則在此項目下運行 go mod init host.prefex/mypkg 命令將自動將此項目轉換為一個使用 go modules 管理依賴的項目。
如果你的一個新項目需要依賴于一個當前正使用其它流行第三方工具來管理包依賴的庫,則請到此庫的根目錄下運行以下 go mod init a.b/c命令(引入路徑可任意),然后將生成的go.mod中的所有require指令復制到你的新項目下的go.mod文件中。(至少對于目前的Go SDK 1.12是如此,以后的Go SDK版本可能會對此過程進行改進。)
一些其它的和modules相關的常用命令和命令選項:
*go list -m all 列出所有的(包括直接的和間接的)將在go build中使用的各個模塊和它們的具體版本號。
- go list -u -m all 列出所有的(包括直接和間接)使用的各個模塊目前可用的小更新或者補丁版本號。undefined
- go get -u or go get -u=patch 將目前所有的(直接和間接)依賴的模塊的版本號更新到最新可用的小更新或者補丁版本號。
- go mod tidy 從go.mod中刪除目前已經不再使用的依賴模塊,加入其它操作系統和架構所需的依賴。在以后的SDK版本中,此命令可能會在執行其它go命令時自動執行。
- go mod vendor 將所有依賴放入當前模塊下的vendor子目錄中。
- go build -mod vendor使用當前模塊下的vendor子目錄中的依賴代碼(而不是緩存中依賴模塊代碼)來編譯構建。
更多關于Go語言的細節、技巧和常識,請訪問《Go語言101》項目或者《Go語言101》官網,或者關注本專欄公眾號(Go 101):
總結
以上是生活随笔為你收集整理的此项目与visual studio的当前版本不兼容_忘掉GOPATH,迎接Go modules,进入Go项目依赖库版本管理新时代...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python点操作符语法_最基础的pyt
- 下一篇: 二叉树的层次遍历_【腾讯面试热身题】二叉