Go語言包管理模式示例分析
正文
任何一門編程語言都離不開對(duì)各種工具包的使用,工具包的管理就顯得異常重要了。Go 的包管理方式是逐漸演進(jìn)的,本文介紹Go語言的兩種包管理模式。
GOPATH模式引包(不推薦)
在 1.5 版本之前,所有的依賴包都是存放在 GOPATH
下,沒有多版本控制。
go的編譯器會(huì)在 $GOPATH/src
下面尋找對(duì)應(yīng)的模塊,src
下的每一個(gè)目錄都可以對(duì)應(yīng)一個(gè)模塊,目錄中的目錄也可以是一個(gè)模塊
下面展示如何在入口文件main.go
里引入非標(biāo)準(zhǔn)庫model
包中的變量
- 目錄層級(jí)如下
├───main │ main.go └───model utils.go
main/main.go
入口文件引入utils
里面的Name
變量model/utils.go
文件聲明package model
,并定義變量var Name string = "xiao"
,變量必須是大寫,否則報(bào)錯(cuò)name not exported by package model
- main.go 文件引model包
package main import ( "fmt" // 引包 // 省略GOPATH/src, Go編譯的時(shí)候會(huì)自動(dòng)在src目錄下尋找 "go_code/pointer/model" ) func main() { fmt.Println(model.Name) // xiao }
開啟GO111MODULE后非module項(xiàng)目產(chǎn)生的問題
在GO111MODULE=on
,并且已經(jīng)設(shè)置GOPATH
的條件下,寫的代碼在$GOPATH/src
下,我想要使用另一個(gè)package
里面的內(nèi)容,并且這個(gè)package不是標(biāo)準(zhǔn)庫,或者說不在GOROOT
里(一般我們不會(huì)修改GOROOT中的內(nèi)容),編譯會(huì)報(bào)錯(cuò),如下????
package go_code/pointer/model is not in GOROOT
解決方法一:
設(shè)置GO111MODULE=off
go env -w GO111MODULE=off
設(shè)置完之后, go env
查看
然后重新編譯即可
解決方法二
使用go mod
, 請(qǐng)看下文介紹??
GO MODULE 模式引包(推薦)
go module 介紹
go modules 是 golang 1.11 新加的特性。
- 模塊是相關(guān)Go包的集合
- modules是源代碼交換和版本控制的單元
go命令直接支持使用modules,包括記錄和解析對(duì)其他模塊的依賴性。modules替換舊的基于GOPATH的方法來指定在給定構(gòu)建中使用哪些源文件。
GO111MODULE 有三個(gè)值:off, on和auto(默認(rèn)值)。
- GO111MODULE=off,go命令行將不會(huì)支持module功能,尋找依賴包的方式將會(huì)沿用舊版本那種通過vendor目錄或者GOPATH模式來查找(也就是本文最開始介紹的方式)。
- GO111MODULE=on,go命令行會(huì)使用modules,不會(huì)去GOPATH目錄下查找所引用的包。
GO111MODULE=auto,默認(rèn)值,go命令行將會(huì)根據(jù)當(dāng)前目錄來決定是否啟用module功能。這種情況下可以分為兩種情形:
- 當(dāng)前目錄在
GOPATH/src
之外且該目錄包含go.mod文件 - 當(dāng)前文件在包含go.mod文件的目錄下面。
- 當(dāng)前目錄在
當(dāng)modules功能啟用時(shí),依賴包的存放位置變更為$GOPATH/pkg
,允許同一個(gè)package多個(gè)版本并存,且多個(gè)項(xiàng)目可以共享緩存的 module
利用GO111MODULE
和GOPROXY
,可以直接將Github上的第三方庫直接下載到本地使用,不需要使用go get命令。執(zhí)行 go run 運(yùn)行時(shí),GOMODULES包管理工具會(huì)自動(dòng)幫我們下載github上面的包
使用 go mod 創(chuàng)建新項(xiàng)目
當(dāng)開啟GO111MODULE
的時(shí)候,才可以使用go mod
1、初始化項(xiàng)目
mkdir test-mod cd test-moe go mod init maze-mod
在項(xiàng)目根目錄生成 go.mod
文件
module test-mod go 1.17 require github.com/astaxie/beego v1.12.1 require ( golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect golang.org/x/text v0.3.0 // indirect )
注意:
有indirect
注釋的代表間接依賴,沒有的代表直接依賴,
前面是版本號(hào)+時(shí)間戳+hash(如:v0.0.0-20190620200207-3b0461eec859
)
go.mod
文件一旦創(chuàng)建后,它的內(nèi)容將會(huì)被go toolchain
全面掌控。go toolchain
會(huì)在各類命令執(zhí)行時(shí)(比如go get、go build、go mod等),修改維護(hù)go.mod
文件。go.mod
提供了module, require、replace和exclude 四個(gè)命令- module 語句指定包的名字(路徑)
- require 語句指定的依賴項(xiàng)模塊
- replace 語句可以替換依賴項(xiàng)模塊
- exclude 語句可以忽略依賴項(xiàng)模塊
2、添加依賴
- 新建
main.go
文件 執(zhí)行
go run main.go
- 一般來說
go mod
模式下,運(yùn)行go run
會(huì)自動(dòng)安裝所有依賴,但是沒有安裝 - 運(yùn)行
go get ./ ...
可以自動(dòng)查找并下載安裝所有的包 - 運(yùn)行
go get package@version
安裝指定版本的依賴包
- 一般來說
3、查看依賴
go list -m all
查看當(dāng)前模塊所依賴的包列表go mod tidy
從go.mod
中移除不需要的依賴
4、go.sum文件
用來做包版本管理
go.sum
文件與go.mod
文件同級(jí)。go.sum
文件是對(duì)導(dǎo)入的依賴包的特定版本的hash
校驗(yàn)值,作用就是記錄第一次下載的依賴版本號(hào),防止有依賴版本升級(jí)帶來的不兼容問題。所以,go.mod
和go.sum
文件都需要被加入版本管理中。
總結(jié)
GOPATH模式
是 go在 1.5 版本之前的包管理模式,不具備版本控制功能,且所有項(xiàng)目的依賴都放在 GOPATH 里面,管理比較混亂GO MODULE
模式是go在1.11 版本推出的,使用git的管理方式,直接從GitHub上下載所需要的依賴,可能會(huì)存在一些安全性問題,同時(shí)國內(nèi)需要設(shè)置GOPROXY
代理服務(wù)器才可使用,相對(duì)來說好用一點(diǎn)。
包管理模式一直是各個(gè)開發(fā)語言所面臨的棘手問題,比如NPM
和Yarn
,設(shè)計(jì)一種完美的包管理模式還需要不斷探索實(shí)踐。
以上就是Go語言包管理模式示例分析的詳細(xì)內(nèi)容,更多關(guān)于Go語言包管理模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang中文字符串截取函數(shù)實(shí)現(xiàn)原理
在golang中可以通過切片截取一個(gè)數(shù)組或字符串,但是當(dāng)截取的字符串是中文時(shí),可能會(huì)出現(xiàn)問題,下面我們來自定義個(gè)函數(shù)解決Golang中文字符串截取問題2018-03-03深入了解Go項(xiàng)目標(biāo)準(zhǔn)目錄布局
本文主要介紹了Go項(xiàng)目標(biāo)準(zhǔn)目錄布局,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Golang通道阻塞情況與通道無阻塞實(shí)現(xiàn)小結(jié)
本文主要介紹了Golang通道阻塞情況與通道無阻塞實(shí)現(xiàn)小結(jié),詳細(xì)解析了通道的類型、操作方法以及垃圾回收機(jī)制,從基礎(chǔ)概念到高級(jí)應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機(jī)器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機(jī)器人實(shí)現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實(shí)現(xiàn)命令行聊天機(jī)器人2023-12-12