您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Golang中的GoPath和GoModule是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
GoModule無法下載國外的依賴包問題
在Golang中,有兩個概念非常容易弄錯,第一個就是GoPath,第二個則是GoModule,很多初學者不清楚這兩者之間的關系,也就難以清晰地了解項目的整體結構,自然也就難以編寫結構清晰的代碼。
什么是Gopath?在我的上一篇博客Golang環境安裝&IDEA開發Golang中,曾經提到過GoPath的概念。
GoPath是Golang的工作空間,所有的Go文件,都需要放在GoPath下的src目錄下才能夠編譯運行,所以我提議不要直接配置全局的GoPath目錄,否則會非常難以管理所有的Golang項目。
但是在另一篇博客Golang連接MySQL數據庫之CRUD中,我也提到過,我們在項目中使用第三方類庫的時候,可以使用go get命令從網下直接拉去第三方類庫的包,而拉取下來的包就會直接下載到我們的GoPath目錄下的src包下。
這樣就導致了一個問題,我們自己的Golang代碼,和第三方的Golang文件混在了一起,這對于我們管理Golang項目的包顯然是非常麻煩的,而且每個如果項目都需要同樣的依賴,那么我們就會在不同的GoPath的src中下載大量重復的第三方依賴包,這同樣會占用大量的磁盤空間。
我們給不同的項目設置不同的GoPath,優點非常明顯:
便于管理項目,每個項目都是不同的GoPath,這對于我們管理多個Golang項目而言,能夠非常清晰的處理項目結構。如果我們把所有項目都放在同一個GoPath的src包下,那么項目的結構就會變得非常混亂,難以管理。
但是當我們需要依賴第三方的包的時候,不同的項目設置不同的GoPath的缺點也非常明顯:
第三方依賴的包和我們自己的Golang包混在一起,會給我們的項目文件管理帶來一定的麻煩。
不同的GoPath都需要下載依賴,那么磁盤中重復的依賴就會非常多,會占用我們大量的磁盤空間。
所以,究竟是設置一個GoPath目錄,解決依賴重復的問題,還是設置不同的GoPath目錄,解決Golang項目結構混亂的問題,這是一個有爭議性的問題。
為了解決這所有的問題,Golang最終引入了GoModule的概念。
GoModule是Golang在1.11版本初步引入的概念,在1.12版本中正是開始使用,所以如果需要使用GoModule,那么需要保證你的Golang的版本在1.12或以上。
另外需要說一下,Golang1.11和1.12版本雖然已經引入了GoModule的概念,但是GoModule是默認不開啟的,如果需要開啟,那么需要配置一個環境變量:GO111MODULE=on,默認是off。
而在Golang1.13及以上的版本中,GoModule的默認配置為auto,即GoModule會通過你的目錄下是否有go.mod文件來判斷是否開啟GoModule。所以Golang1.13+的版本中我們就不需要配置GO111MODULE屬性了。
所以如果你使用GoModule,那么就直接使用Golang1.13+的版本好了!
那么究竟什么是GoModule?
其實說得直白一下,GoModule就是一個用來取代GoPath的Golang的工作空間。
我們之前說過,所有的Golang的文件,都需要放在GoPath目錄下才能進行正確的編譯和運行,而有了GoModule之后,那么我們就可以把文件放在GoModule目錄下,而放在GoModule目錄下的Golang文件,也可以正確地編譯運行。
那么我們有了GoModule之后,GoPath是不是就可以被舍棄了?
不是的!
我們之前說過,GoPath所引出的問題,就是因為第三方類庫的包所導致的,所以我們在有了GoModule之后,GoPath和GoModule就分別負責不同的職責,共同為我們的Golang項目服務。
GoPath我們用來存放我們從網上拉取的第三方依賴包。
GoModule我們用來存放我們自己的Golang項目文件,當我們自己的項目需要依賴第三方的包的時候,我們通過GoModule目錄下的一個go.mod文件來引用GoPath目錄src包下的第三方依賴即可。
這樣依賴,既解決了原來只能局限在GoPath目錄src包下進行編程的問題,也解決了第三方依賴包難以管理和重復依賴占用磁盤空間的問題。
總而言之,在引入GoModule之后,我們不會直接在GoPath目錄進行編程,而是把GoPath作為一個第三方依賴包的倉庫,我們真正的工作空間在GoModule目錄下。
既然搞清楚了GoPath和GoModule之間的區別,那么GoModule又該怎么配置呢?一個目錄怎么才能算是一個GoModule目錄了。
很簡單,我們直接使用go mod init 模塊名稱命令對目錄進行初始化操作,即可將這個目錄設置為GoModule目錄。
我們在F:\GoModule目錄下創建一個文件夾,名字為:go_module。
然后通過cmd命令提示符進入該目錄,執行go mod init 模塊名稱初始化命令。
當初始化命令執行完畢之后,會在go_module目錄下生成一個go.mod文件,該文件就是用來引入GoPath目錄下的第三方依賴的文件。
初始化之后的go.mod文件
module go_module
go 1.14
當我們需要引入GoPath目錄下的第三方依賴包的時候,只需要在go.mod目錄下添加依賴名稱,GoModule就會自動幫我們把第三方依賴包下載到GoPath目錄下。
例如下面的go.mod文件:
我們在這個go.mod文件中引入了兩個依賴,分別是:beego框架 v1.12.1版本和mysql驅動 v1.5.0版本。
而如果我們使用IDE進行開發的話,那么可以直接創建一個GoModule項目,這樣的話IDE會自動幫我們生成所需要的文件,而且在使用依賴的包的時候,IDE還會自動幫我們加入依賴和下載依賴,這會省去我們大量的時間,而且可以不用再去記憶依賴的具體包名和版本號。
GoModule無法下載國外的依賴包問題
這是一個很多開發者都碰到過的問題,對于國外的依賴包無法直接通過網絡進行下載,這顯然會讓開發者非常難受,所以Golang也引入了另一個屬性:GOPROXY,我們只需要在環境變量中配置GOPROXY=https://goproxy.io即可解決GoModule無法下載國外的依賴包問題。
當然,也可以通過IDE來配置,這樣省的在電腦系統的環境變量配置太多難以管理。
在IDEA中配置GOPROXY屬性:
關于“Golang中的GoPath和GoModule是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。