主頁(yè) > 知識(shí)庫(kù) > 解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系

熱門標(biāo)簽:烏魯木齊人工電銷機(jī)器人系統(tǒng) 賺地圖標(biāo)注的錢犯法嗎 澳門防封電銷卡 福州鐵通自動(dòng)外呼系統(tǒng) 濮陽(yáng)自動(dòng)外呼系統(tǒng)代理 廣東語(yǔ)音外呼系統(tǒng)供應(yīng)商 地圖標(biāo)注測(cè)試 長(zhǎng)沙ai機(jī)器人電銷 智能電銷機(jī)器人營(yíng)銷

一、GOROOT介紹

在安裝完Golang語(yǔ)言的時(shí)候,所謂的安裝路徑其實(shí)就是你的GOROOT路徑,也就是說(shuō)GOROOT存放的Golang語(yǔ)言內(nèi)建的程式庫(kù)的所在位置,而通常你安裝完后,你電腦的環(huán)境變數(shù)就會(huì)設(shè)好GOROOT路徑,當(dāng)你開發(fā)Golang程式的時(shí)候,當(dāng)你import內(nèi)建的程式庫(kù)的時(shí)候,并不需要額外安裝,而當(dāng)程式運(yùn)行后,預(yù)設(shè)也會(huì)先去GOROOT路徑下尋找相對(duì)應(yīng)的程式庫(kù)來(lái)運(yùn)行。

1、查看Glang環(huán)境變量

go env

env中有些是我已經(jīng)修改過的,通常如果你是初次安裝Golang語(yǔ)言并且沒做什么環(huán)境變數(shù)設(shè)定的話,GOROOT設(shè)定路徑就是你當(dāng)初安裝Golang語(yǔ)言的路徑,而GOPATH通常預(yù)設(shè)會(huì)是使用者目錄下的go資料夾。

2、使用 go run 執(zhí)行某個(gè)文件

package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

然后再執(zhí)行以下指令:

go run main.go

就會(huì)成功輸出hello worldgo run其實(shí)會(huì)幫你將程式碼進(jìn)行編譯并產(chǎn)生執(zhí)行檔,而編譯檔跟執(zhí)行檔事實(shí)上是存在一個(gè)暫存資料夾里面,當(dāng)運(yùn)行完此程式就會(huì)自動(dòng)刪除。該指令可以想成類似直譯的方式運(yùn)行,而不需要做其他任何環(huán)境設(shè)定,即可運(yùn)行。

3、引用第三方套件

package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.Run()
}

import了一個(gè)github.com/gin-gonic/gin套件,這個(gè)是別人開發(fā)的Web Framework套件,是不存在于官方程式庫(kù)的,而是放在GitHub上的第三方套件。

  • 當(dāng)執(zhí)行Golang程式碼,當(dāng)需要存取套件時(shí),會(huì)先去GOROOT路徑下的src資料夾找同等于我們?cè)诔淌酱a中import的路徑下去找有沒有gin這個(gè)資料夾,而這資料夾里面就是包含了所有有關(guān)于該套件的程式庫(kù)。
  • 如果在GOROOT路徑下沒有找到,則會(huì)往GOPATH路徑下的src資料夾找同等于我們?cè)诔淌酱a中import的路徑下去找有沒有gin這個(gè)資料夾。

所以只要GOROOTGOPATH路徑下都沒有找到該套件的話,就無(wú)法執(zhí)行該程式碼。

二、GOPATH介紹

根據(jù)上面GOROOT的介紹,我們可以知道官方的程式庫(kù)所在位置就是在GOROOT里面,而GOPATH就是專門存放第三方套件以供我們程式碼的需要。那通常開發(fā)Golang的話,通常會(huì)在重新設(shè)定GOPATH的位置。

1、GOPATH目錄

bin
pkg
src

依照Golang語(yǔ)言的慣例(強(qiáng)制),GOPATH是指src路徑的上一層,我們要在GOPATH路徑下主動(dòng)新增src資料夾,所謂src就是代表source code的意思,也就是放我們開發(fā)Golang程式碼的相關(guān)專案的原始碼。

2、GOPATH的缺點(diǎn)

第三方套件只要不是官方程式庫(kù),都需要放置在GOPATH/src的路徑下才可以使用。

go get最常用在當(dāng)我們想用別人公開在GitHub上的套件,可以幫我們從網(wǎng)路上clone到GOPATH/src里面。雖然這樣很方便,但是你會(huì)發(fā)現(xiàn)GOPATH/src下的程式碼會(huì)很復(fù)雜,除了有你自己開發(fā)的專案資料夾,也包含其他第三方程式庫(kù)的專案資料夾。

再來(lái),如果你開發(fā)的專案采用第三方套件是不同版本怎么辦?以往的解決方法是要設(shè)定多組不同的GOPATH。雖然社群也有開發(fā)相對(duì)應(yīng)的package manager,如VendorDep來(lái)解決該問題,但畢竟不是官方主導(dǎo)的。

三、Go Modules的誕生

為了解決不被GOPATH的問題,因此官方在1.11開始推出了Go Modules的功能。Go Modules解決方式很像是Java看到Maven的做法,將第三方程式庫(kù)儲(chǔ)存在本地的空間,并且給程式去引用。

1、設(shè)定GO111MODULE環(huán)境變數(shù)

總共可以三種不同的值:

  • auto

默認(rèn)值,go命令會(huì)根據(jù)當(dāng)前目錄來(lái)決定是否啟用modules功能。需要滿足兩種情形:
該專案目錄不在GOPATH/src/
當(dāng)前或上一層目錄存在go.mod檔案

  • on

go命令會(huì)使用modules,而不會(huì)GOPATH目錄下查找。

  • off

go命令將不會(huì)支持module功能,尋找套件如以前GOPATH的做法去尋找。

我是建議要開發(fā)Go專案就不再使用GOPATH的功能了,而是采用Go Modules的做法,因此建議都設(shè)定為on。
而采用Go Modules,下載下來(lái)的第三方套件都在哪呢?其實(shí)就位在GOPATH/pkg/mod資料夾里面。

2、初始化mod

go mod init module name>

module name>可填可不填,不填的話預(yù)設(shè)就是采用專案資料夾的名稱。

在此檔案內(nèi)可以寫以下幾個(gè)關(guān)鍵字:

  • module

定義模組路徑

  • go

定義go語(yǔ)言version

  • require

指定依賴的套件,預(yù)設(shè)是最新版,可以指定版本號(hào)

  • exclude

排除該套件和其版本

  • replace

使用不同的套件版本并替換原有的套件版本注解
// 單行注解
/* 多行注解*/
indirect 代表被間接導(dǎo)入的依賴包

假設(shè)現(xiàn)在我要引入GitHub上的gin-gonic/gin的套件,如下定義:

module awesomeProject

go 1.13

require github.com/gin-gonic/gin v1.6.3

再執(zhí)行以下指令:

go mod download

會(huì)將需要的套件安裝在GOPATH/pkg/mod資料夾里面。而且會(huì)發(fā)現(xiàn)出現(xiàn)一個(gè)go.sum的檔案,這個(gè)檔案基本上用來(lái)記錄套件版本的關(guān)系,確保是正確的,是不太需要理會(huì)的。

官方說(shuō)明:除了go.mod之外,go命令還維護(hù)一個(gè)名為go.sum的文件,其中包含特定模塊版本內(nèi)容的預(yù)期加密哈希
go命令使用go.sum文件確保這些模塊的未來(lái)下載檢索與第一次下載相同的位,以確保項(xiàng)目所依賴的模塊不會(huì)出現(xiàn)意外更改,無(wú)論是出于惡意、意外還是其他原因。 go.mod和go.sum都應(yīng)檢入版本控制。
go.sum 不需要手工維護(hù),所以可以不用太關(guān)注。

如果將gin版本改成v1.4.0再重新執(zhí)行go mod download,就會(huì)發(fā)現(xiàn)在GOPATH/pkg/mod里面gin-gonic會(huì)有兩個(gè)資料夾分別是gin@v1.4.0、gin@v1.5.0,借此來(lái)區(qū)分版本。

當(dāng)然其實(shí)也可以不執(zhí)行g(shù)o mod download,而直接運(yùn)行g(shù)o build or go install 也會(huì)自動(dòng)將套件安裝在相對(duì)應(yīng)的地方。

還有一種方式直接下載套件而不用在go.mod中定義:

go get github.com/gin-gonic/gin@v1.5.0

只要有開啟go modules功能,go get 就不會(huì)像以前一樣在GOPATH/src下放置套件檔案,而是會(huì)放在GOPATH/pkg/mod里面,并且go.mod會(huì)寫好引入,這樣也就不用使用go mod download指令了。

到此這篇關(guān)于解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系的文章就介紹到這了,更多相關(guān)GOROOT GOPATH Go-Modules內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang 1.16 中 Modules的主要變化更新
  • 解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問題
  • Go 自定義package包設(shè)置與導(dǎo)入操作
  • goland 設(shè)置project gopath的操作
  • 解決Goland 同一個(gè)package中函數(shù)互相調(diào)用的問題
  • 淺談golang package中init方法的多處定義及運(yùn)行順序問題
  • Goland使用Go Modules創(chuàng)建/管理項(xiàng)目的操作

標(biāo)簽:太原 調(diào)研邀請(qǐng) 貴陽(yáng) 廣西 慶陽(yáng) 阿克蘇 西雙版納 德州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系》,本文關(guān)鍵詞  解析,GOROOT,GOPATH,Go-Modules-,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于解析GOROOT、GOPATH、Go-Modules-三者的關(guān)系的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章