跳出Go module的泥潭

來源:互聯網
上載者:User

Go 1.11 前天已經正式發布了,這個版本包含了兩個最重要的feature就是 moduleweb assembly。雖然也有一些簡單的教程介紹了go module的特性,但是基本上都是hello world的例子,在實踐的過程中, 很多人都在“拚命的掙紮”,包括我自己, 從一些qq群、github的issue, twitter上都可以看到大家茫然或者抱怨的語句。

雖然有三個協助檔案go help modgo help modulesgo help module-get可以瞭解一些go module的用法,但是感覺Go開發組對module這一特性還是沒有很好的做一個全面的介紹,很多情況還得靠大家看原始碼或者去猜,比如module下載的檔案夾、版本格式的完整聲明,module的最佳實務等,並且當前Go 1.11的實現中還有一些bug,給大家在使用的過程中帶來了很大的困難。

我也在摸索中前行, 記錄了摸索過程中的一些總結,希望能給還在掙紮中的Gopher一些協助。

Introduction to Go Modules 是一篇很好的go module 入門介紹, 如果你仔細閱讀了它,應該就不需要看本文了。

GO111MODULE

要使用go module,首先要設定GO111MODULE=on,這沒什麼可說的,如果沒設定,執行命令的時候會有提示,這個大家應該都瞭解了。

既有項目

假設你已經有了一個go 項目, 比如在$GOPATH/github.com/smallnest/rpcx下, 你可以使用go mod init github.com/smallnest/rpcx在這個檔案夾下建立一個空的go.mod (只有第一行 module github.com/smallnest/rpcx)。

然後你可以通過 go get ./...讓它尋找依賴,並記錄在go.mod檔案中(你還可以指定 -tags,這樣可以把tags的依賴都尋找到)。

通過go mod tidy也可以用來為go.mod增加丟失的依賴,刪除不需要的依賴,但是我不確定它怎麼處理tags

執行上面的命令會把go.modlatest版本換成實際的最新的版本,並且會產生一個go.sum記錄每個依賴庫的版本和雜湊值。

新的項目

你可以在GOPATH之外建立新的項目。

go mod init packagename可以建立一個空的go.mod,然後你可以在其中增加require github.com/smallnest/rpcx latest依賴,或者像上面一樣讓go自動探索和維護。

go mod download可以下載所需要的依賴,但是依賴並不是下載到$GOPATH中,而是$GOPATH/pkg/mod中,多重專案可以共用快取的module。

go mod命令

12345678
download    download modules to local cache (下載依賴的module到本地cache))edit        edit go.mod from tools or scripts (編輯go.mod檔案)graph       print module requirement graph (列印模組依賴圖))init        initialize new module in current directory (再當前檔案夾下初始化一個新的module, 建立go.mod檔案))tidy        add missing and remove unused modules (增加丟失的module,去掉未用的module)vendor      make vendored copy of dependencies (將依賴複製到vendor下)verify      verify dependencies have expected content (校正依賴)why         explain why packages or modules are needed (解釋為什麼需要依賴)

有些命令還有bug, 比如go mod download -dir:

1234
go mod download -dir /tmpflag provided but not defined: -dirusage: go mod download [-dir] [-json] [modules]Run 'go help mod download' for details.

協助裡明明說可以設定dir,但是實際卻不支援dir參數。

看這些命令的協助已經比較容易瞭解命令的功能。

翻牆

在國內訪問golang.org/x的各個包都需要翻牆,你可以在go.mod中使用replace替換成github上對應的庫。

12345
replace (golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dacgolang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638dgolang.org/x/text v0.3.0 => github.com/golang/text v0.3.0)

依賴庫中的replace對你的主go.mod不起作用,比如github.com/smallnest/rpcxgo.mod已經增加了replace,但是你的go.mod雖然requirerpcx的庫,但是沒有設定replace的話, go get還是會訪問golang.org/x

所以如果想編譯那個項目,就在哪個項目中增加replace

版本格式

下面的版本都是合法的:

12345
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7gopkg.in/vmihailenco/msgpack.v2 v2.9.1gopkg.in/yaml.v2 <=v2.2.1github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3elatest

go get 升級

  • 運行 go get -u 將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號碼, y是次要版本號碼)
  • 運行 go get -u=patch 將會升級到最新的修訂版本
  • 運行 go get package@version 將會升級到指定的版本號碼version

go mod vendor

go mod vendor 會複製modules下載到vendor中, 貌似只會下載你代碼中引用的庫,而不是go.mod中定義全部的module。

go module, vendor 和 Travis CI

https://arslan.io/2018/08/26/using-go-modules-with-vendor-support-on-travis-ci/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.