您好,登錄后才能下訂單哦!
本篇內容主要講解“go的modules怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“go的modules怎么使用”吧!
在go環境的shell中執行go mod help
查看命令和說明。
Usage: go mod <command> [arguments] The commands are: download download modules to local cache edit edit go.mod from tools or scripts graph print module requirement graph init initialize new module in current directory tidy add missing and remove unused modules vendor make vendored copy of dependencies verify verify dependencies have expected content why explain why packages or modules are needed
用go env
查看go的環境變量,在所有go提供的環境變量中,有一個是和go mod
相關的。
GO111MODULE="on" GOPROXY="https://goproxy.cn,direct" GONOPROXY="git.example.com,x1" GONOSUMDB="git.example.com,x1" GOPATH="/home/go-project/" GOPRIVATE="git.example.com,x1" GOSUMDB="sum.golang.org" # 省略其余環境變量...
1) GO111MODULE
go語言提供GO111MODULE
環境變量三個值,用于GO111MODULE
的開關:
auto:只要項目中包含了go.mod
這個文件,就啟動該項目的go modules,在 Go1.11 至 Go1.14 中仍然是默認值。
on:啟動go modules
off:關閉go modules
2) GOPROXY
go env
中默認的代理是GOPROXY="https://proxy.golang.org,direct"
,但是在國內是無法訪問的,這里需要設置成國內的代理地址GOPROXY="https://goproxy.cn,direct"
GOPROXY
的值是一個以英文逗號 “,” 分割的 Go 模塊代理列表,允許設置多個模塊代理,假設你不想使用,也可以將其設置為 “off” ,這將會禁止 Go 在后續操作中使用任何 Go 模塊代理。
direct
實際上 “direct” 是一個特殊指示符,用于指示 Go 回源到模塊版本的源地址去抓取(比如 GitHub 等),場景如下:當值列表中上一個 Go 模塊代理返回 404 或 410 錯誤時,Go 自動嘗試列表中的下一個,遇見 “direct” 時回源,也就是回到源地址去抓取,而遇見 EOF 時終止并拋出類似 “invalid version: unknown revision…” 的錯誤。
在cmd中執行set GO111MODULE=on
3)GONOPROXY/GONOSUMDB/GOPRIVATE
這三個環境變量都是用在當前項目依賴了私有模塊,例如像是你公司的私有 git 倉庫,又或是 github 中的私有庫,都是屬于私有模塊,都是要進行設置的,否則會拉取失敗。對于一些自己的私有模塊代碼,需要在GOPRIVATE
上設置,在拉取時會提示輸入用戶名和密碼。
可以設置多個,用英文的逗號分隔開;或者用通配符等
go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote" go env -w GOPRIVATE="*.example.com" # 通配example.com的域名
開啟go modules
后,就可以創建項目并且生成mod文件,來管理項目的所有依賴了。以下是go env
環境的配置:
GO111MODULE="auto" GOARCH="amd64" GOBIN="/go/bin/" GOCACHE="/root/.cache/go-build" GOENV="/root/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/go-project/" GOPRIVATE="" GOPROXY="https://goproxy.cn,direct" GOROOT="/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/go/pkg/tool/linux_amd64" GCCGO="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build940953411=/tmp/go-build -gno-record-gcc-switches"
設置了GOPATH
為/home/go-project/
,并且代理指向了國內的代理地址,防止國外鏡像無法訪問的情況。
在$GOPATH
目錄下創建一個新的項目example.com/mycount/hello
,example.com
模擬github.com,mycount
模擬賬號,hello
是最終的項目名稱。目錄和文件結構:
2.1.1 初始化.mod文件
在hello
目錄下執行go mod init example.com/mycount/hello
初始化hello項目的mod文件,如下:
執行完初始化操作后生成了一個go.mod的文件,里面只記錄了2行:
module:用于定義當前項目的模塊路徑
go:用于標識當前模塊的 Go 語言版本,值為初始化模塊時的版本,目前來看還只是個標識作用
2.1.2 簡單一個示例
在hello
目錄下寫一個main.go
的文件,里面用了一個第三方的庫。
package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/json-iterator/go" ) type resp struct { Status int `json:"status"` Message string `json:"message"` } func main() { router := gin.Default() router.GET("/", hello()) if err := router.Run(":6060"); err != nil { panic(err) } } func hello() gin.HandlerFunc { return func(context *gin.Context) { strResp, _ := jsoniter.MarshalToString(resp{ Status: http.StatusOK, Message: "success", }) context.String(http.StatusOK, strResp) } }
在hello
目錄下執行go get
命令,拉取依賴庫:
拉取依賴之后生成了一個go.mod和go.sum文件,go.mod文件:
go.sum的內容:
同時在$GOPATH
目錄下多了一個pkg文件,里面有拉取的文件依賴。這個文件是一個全局的緩存,
2.1.3 go modules的go get
在拉取項目依賴時,你會發現拉取的過程總共分為了三大步,分別是 finding(發現)、downloading(下載)以及 extracting(提取), 并且在拉取信息上一共分為了三段內容:
需要注意的是,所拉取版本的 commit 時間是以UTC時區為準,而并非本地時區,同時我們會發現我們 go get 命令所拉取到的版本是 v0.0.0,這是因為我們是直接執行 go get -u 獲取的,并沒有指定任何的版本信息,由 Go modules 自行按照內部規則進行選擇。
那么我想選擇具體版本應當如何執行呢,如下:
公開的發布包無需修改go env中的一些環境變量,默認的環境變量即可。
3.1.1 包的實現
假設我們有一個模塊需要提供給第三方使用,并且這個包是發布在了gittee上,假設我在gitee上得賬號是gitee.com\luciferofwg
。我們后期會根據迭代或者功能維護版本,每當有更新或者升級的時候就發布最新的版本,版本遵循語義化版本定義。什么是語義化版本
這個包中包含一個函數,用于打印一句話,如下所示:
// hello.go package hello import "fmt" func SayHello() { fmt.Println("hello world") }
在GOPATH下新建目錄hello
,在命令行下進入hello
目錄,執行go mod init
來生成go mod文件,如下:
生成的包名為gitee.com/luciferofwg/hello
,后期在引用這個包時就import 這個包名。
將hello
倉庫提交到gitee
上,完成發布包的第一個階段。
3.1.2 包的發布
經過上一步驟,在倉庫中就有了一個名為hello
的公開倉庫,如下:
假如我們認為這個版本是穩定可靠的,這時候我們需要發布一個可以使用的版本,gitee發布的流程如下:
點擊倉庫中右側的創建
按鈕,在彈出的頁面中創建發行版本號,填寫完畢后點擊創建發行版本
完成發布。
圖1 創建發行版本
圖2 發行版本信息
圖3 已創建的發行版本
到此我們發行了一個版本為v1.0.4
的版本。
3.1.3 包的使用
對于已經發行的包,這里介紹如何使用它。首先定義一個名為test
的包,因為test為調用的程序,因此我們初始化mod時直接按照程序的名字初始化,即:go mod test
,完成初始化。如下:
在test
目錄下編寫如下代碼:
package main import "gitee.com/luciferofwg/hello" func main() { hello.SayHello() }
然后再命令行中執行go mod tidy
整理go mod,此時go mod
會根據程序包的引用關系按照包名從互聯網上拉去對應的包。執行完成后go.mod
如下:
運行的結果:
需要注意的是:
默認拉去的是最新的發布版本,如果想制定版本,只需要修改go.mod中require最后面的版本號即可。如何修改go.mod
參考go help mod
命令的edit
項。
3.2.1 go env環境變量和git配置的修改
1.go env環境變量的修改
私有包和公開包的區別最大的區別是權限的和git拉去包的過程,這時候需要對go env
中的一些參數修改。涉及到的一些參數GOINSECURE
,GONOPROXY
,GONOSUMDB
,含義:GOINSECURE
:如果代碼倉庫是自己搭建的,沒有“合法”的證書,則需要配置這個信息GONOPROXY
:在這個變量中配置的域名或者倉庫地址不會走代理(我們在前面設置了cn的代理)GONOSUMDB
:1.15后會對包進行校驗,此處的配置和GONOPROXY
的含義一樣
看一下我們的go env
變量,之前已經修改過了,內容如下:
注:
windows下修改時直接將上述的配置增加系統的環境變量即可,linux下在bash的配置文件中修改(具體修改可以自行搜索)。
2.git配置的修改
由于是私有的包,拉去時需要獲取拉去的權限,默認的https或者http的方式需要密碼。如果我們本地已經配置了對應的gitee上的私鑰,且已經在gitee對應的賬戶上配置了權限,那么我們就可以通過git@xxx
的方式訪問私有的倉庫。
打開本地git的配置,windows下是c:\\user\\用戶名\\.bashconfig
文件,打開這個文件。增加以下代碼:
[url "git@gitee.com:"]insteadof = https://gitee.com
表示訪問https://gitee.com
的過程替換為git@gitee.com:
,即通過bash就可以訪問私有庫了。
3.2.2 私有包的實現
1.私有包實現
我們創建一個私有的倉庫,名為hi,包含一個函數SayHello,打印hello world。
同樣的,創建go.mod
,實現SayHello函數,推送到gitee。
圖1 私有倉庫hi
2.函數和源碼
// hi包的SayHello函數 package hi import "fmt" func SayHello() { fmt.Println("hi, world") }
hi包的go.mod
3.2.3 私有包的發布
根據上述的源碼,使用同樣的方式發布版本。
圖1 發布的版本1.0.0
3.2.4 私有包的引用
如果已經配置了go env的參數和git配置,使用的過程和公開包的使用是一樣的。基于原來的版本,增加了一個hi
包的函數引用和導入,在test目錄下執行go mod tidy
,就會自動拉取發布的包了。
package main import ( "gitee.com/luciferofwg/hello" "gitee.com/luciferofwg/hi" ) func main() { hello.SayHello() hi.SayHello() }
test程序的go.mod如下:
到此,相信大家對“go的modules怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。