go module 介紹:
自Go1.1.1版本發佈(2018-08-24發佈),從官方的博客中看到,其中有個比較突出的特色就是module,模塊概念。
module是一個相關Go包的集合,它是源代碼更替和版本控制的單元。模塊由源文件形成的go.mod文件的根目錄定義,包含go.mod文件的目錄也被稱爲模塊根。moudles取代舊的的基於GOPATH方法來指定在工程中使用哪些源文件或導入包。模塊路徑是導入包的路徑前綴,go.mod文件定義模塊路徑,並且列出了在項目構建過程中使用的特定版本。
該功能到時候就可以移除對GOPATH和go get命令的支持。
go module 常用命令:
go mod init #當前模塊下初始化
go mod go mod tidy #添加缺失的模塊以及移除無用的模塊
go mod verify #驗證依賴項是否達到預期的目的
go mod vendor #生成vendor文件夾
配置環境變量 GO111MODULE:
GO111MODULE它有三個可選值: off、 on、 auto,默認值是 auto。
1.GO111MODULE=off,無模塊支持,go會從 GOPATH 和 vendor 文件夾尋找包。
2.GO111MODULE=on,模塊支持,go會忽略 GOPATH 和 vendor 文件夾,只根據 go.mod下載依賴。
3.GO111MODULE=auto,在 $GOPATH/src外面且根目錄有 go.mod文件時,開啓模塊支持。
go.mod 文件:
go.mod文件定義module路徑以及列出其他需要在build時引入的模塊的特定的版本。
go.mod文件會在go mod init 時會自動生成,當項目不在GoPath下,需要go mod init [模塊名];
在生成的go.mod文件中,我們可以修改版本號如下方的v1.3.0,來指定版本
require (
github.com/gin-gonic/gin v1.3.0
)
還有一點需要注意的是,在國內訪問不少第三方包都需要科學上網:
我們可以在項目下 打開cmd通過命令行設置代理,然後再執行go mod的命令即可;
也可以在go.mod中使用replace替換成github上對應的庫。
具體使用步驟:
- 首先將你的Go更新到1.11以上版本;
- 如果項目在GoPath目錄下,設置系統環境變量GO111MODULE=on;
- 執行命令go mod init [模塊名] 在當前目錄下生成一個go.mod文件;
- 如果你工程中存在一些不能確定版本的包,那麼生成的go.mod文件可能就不完整,因此繼續執行下面的命令;
- 執行go mod tidy命令,它會添加缺失的模塊以及移除不需要的模塊。執行後會生成go.sum文件(模塊下載條目)。添加參數-v,例如go mod tidy -v可以將執行的信息,即刪除和添加的包打印到命令行;
- 執行命令go mod verify來檢查當前模塊的依賴是否全部下載下來,是否下載下來被修改過。如果所有的模塊都沒有被修改過,那麼執行這條命令之後,會打印all modules verified。
- 執行命令go mod vendor生成vendor文件夾,該文件夾下將會放置你go.mod文件描述的依賴包,文件夾下同時還有一個文件modules.txt,它是你整個工程的所有模塊。在執行這條命令之前,如果你工程之前有vendor目錄,應該先進行刪除。同理go mod vendor -v會將添加到vendor中的模塊打印出來;
常見的命令如下,格式爲 go mod COMMAND:
命令 | 解釋 |
init -【模塊名】 | 初始化modules |
download | 下載modules到本地cache |
edit | 從工具或腳本中編輯go.mod文件 |
graph | 以文本模式打印模塊需求圖 |
tidy | 檢查,刪除錯誤或者不使用的modules,下載沒download的package |
vendor | 生成vendor目錄 |
verify | 驗證依賴是否正確 |
why | 解釋爲什麼需要包或模塊 |
本人由go vendor管理轉到go module折騰了很久,踩了很多各種各樣的坑,在此不便過多贅述,小夥伴若遇到其它問題,歡迎留言交流。