go modules 的一些細節

前言

在一些Java的項目中,有 Maven等這些版本管理工具,能夠很好的管理各類版本依賴關係,可是在 Golang 的項目中,以前官方並無提供版本管理工具,之前都是用 go get 進行安裝, 隨着項目的變大, 就處理這種依賴關係就變得很麻煩, 原文git

若是你對Go感興趣, 能夠關注個人公衆號: GoGuidergithub

vendor 機制

爲了解決版本依賴問題, 官方出了一個 vendor 機制,將項目依賴的包都放在該目錄中,但這也並無很好地管理依賴的版本。安全

由於vendor 機制有幾個大的問題:bash

一、須要將外部庫放到項目中, 致使項目體積變得很大
二、項目版本很難指定和控制app

go dep 和 go modules

以後官方出了一個準官方版本管理工具 go dep,這也算是 go modules 的前身了吧。隨着 Go1.11 的發佈,Golang 給咱們帶來了 module 全新特性,這是 Golang 新的一套依賴管理系統。在 Go1.12發佈後,go modules 進一步穩定,但官方仍是沒有將其設爲默認機制,因此踩坑之路是必須的,本篇文章除了詳細說明 go modules 的特性以及使用以外,還總結了我在這個過程當中遇到的一些「坑」。ide

目前 go help modgo help modulesgo help module-get能夠了解一些go module的用法, 不過有些用法仍是介紹的不夠詳細, 須要咱們進行猜; 因此今天整理了一篇文章和你們一塊兒瞭解。工具

隨着go1.12就要發佈了。這是首個將go modules歸入正式支持的穩定版本。go modules引入go.mod, 咱們能夠更好的管理外部庫以及版本了。ui

在go.mod中指定版本

在使用go get 若是咱們想指定一些版本信息, 能夠參照下面的操做:google

go get github.com/mqu/go-notify@ef6f6f49spa

在go.mod文件中咱們也須要這樣指定, 目標庫 帶上指定版本, 這樣能夠安裝時明確版本, 避免不避免的麻煩, 增長項目的肯定性和安全性。

因此 在go.mod中也須要這樣指定版本

module github.com/goguider/hello

go 1.12

require (
	cloud.google.com/go v0.37.1 // indirect
	github.com/PuerkitoBio/goquery v1.5.0
	github.com/araddon/dateparse v0.0.0-20190223010137-262228af701e
	github.com/b3log/gulu v0.0.0-20190806034141-2b1d1b33ff3d
	github.com/b3log/lute v0.0.0-20190922061740-a6de76dabec1
	github.com/beevik/etree v1.1.0 // indirect
	github.com/bluele/gcache v0.0.0-20190301044115-79ae3b2d8680
	...
)
複製代碼

go modules 發佈以後,就徹底統一了包引用的地址,如上面咱們說的建立 go.mod 文件後, 使用初始化內容的第一行就是咱們說的項目依賴路徑,一般來講該地址就是項目的倉庫地址,全部須要引用項目包的地址都填寫這個地址,不管是內部之間引用仍是外部引用

go mod 相關命令

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 (解釋爲何須要依賴)
複製代碼

最後會有一個go.sum文件

每個引入庫, 後面都有一個惟一標記, 用來控制版本, 也就是版本號 + 時間戳 +hash。

若是你對Go也感興趣, 能夠關注個人公衆號

相關文章
相關標籤/搜索