go語言中GOPATH GOROOT的作用和設置方式
GOPATH 和 GOROOT
不同於其他語言,go中沒有項目的說法,隻有包, 其中有兩個重要的路徑,GOROOT 和 GOPATH GOROOT是安裝目錄,GOPATH是我們的工作空間, 用來存放包的目錄
GOPATH可以設置多個,其中,第一個將會是默認的包目錄,使用 go get 下載的包都會在第一個path中的src目錄下,使用 go install時,在哪個GOPATH中找到瞭這個包,就會在哪個GOPATH下的bin目錄生成可執行文件
修改 GOPATH 和 GOROOT
安裝的時候如果沒有更改設置,默認的GOROOT是在 C:\Go中,而 GOPATH會是在 C:\users\youName\go,
如果我們更改瞭go的安裝位置,那麼可以需要設置一下GOROOT 環境變量瞭
打開環境變量設置,查看下面的系統變量,如果有 GOROOT這個選項的話,查看是否需要更改,沒有的話,新建一個就可以瞭,如圖:
同理,如果我們想在加一個工作空間的話,直接更改 GOPATH就可以瞭, go安裝的時候會在上面的用戶變量中添加GOPATH, 如果沒有的話像上一步一樣新建就可以瞭,多個目錄使用 ; 分號隔開
不管是可執行包,還是非可執行包,通通都應該在某個 $GOPATH/src下。如果你這樣做瞭,那麼就不會出現本地包這種寫法瞭
import "./path/package"
比如你可以把你的可執行(項目)包,安放在某個 $GOPATH/src下,例如 $GOPATH/src/app/youpackagedir
這樣本地包的import就變成
import "app/yourpackagedir/subpackage"
這樣有什麼用呢?
1、可以使用 go install 你的子包,有利於go build的時間,如果子包較大,那就更明顯瞭
2、go code的自動完成可以用瞭
修改完以後需要重啟 命令行工具, cmd/powershell/gitbash/Other,不重啟不會生效的
補充:Go項目的環境變量GOROOT和GOPATH的設置-那些踩過的坑
那些遇到過的問題
不知道集美們在初次運行go項目的時候會不會遇到一些奇奇怪怪的問題,反正我是遇到瞭(我自己太菜瞭)。解決這些問題經常要花半天、一天的時間,甚至是好幾個月(其實是被我拋到腦後瞭,但是遲早要解決)。我就開始陸陸續續把問題及其解決方法整理出來,形成瞭該篇文章。
import “github.com/xx/xx”出問題?
can’t resolve the diectory
需要go get github.com\xx\xx,將包從github上下載下來,自動放在gopath設置的路徑裡面。
import”golang.org/xx/xx”出問題?
使用go get golang,org/xx/xx方法不能下下來。golang組織在github上建瞭一個鏡像庫。下載方法如下:
首先在gopath下創建好src/golang.org/x/目錄。後面就是按照同樣的方式進行下載瞭。比如golang.org/x/text,拉取該模塊代碼:
git clone https://github.com/golang/net.git
其他的子包下載:
$ git clone https://github.com/golang/tour.git $ git clone https://github.com/golang/net.git $ git clone https://github.com/golang/blog.git $ git clone https://github.com/golang/sync.git $ git clone https://github.com/golang/tools.git $ git clone https://github.com/golang/lint.git
設置GOROOT和GOPATH
先設置系統環境變量
GOROOT應為go sdk的安裝目錄。GOPATH可以設定為自己想要的位置,以後go項目需要的依賴庫都會存放在這個路徑下面。
設置GOLAND中的GOROOT和GOPATH
GOROOT為go sdk的安裝目錄
GOPATH不用改變,自動為系統變量。
Go Modules(vgo)enable選項註意取消勾選或者勾選
用命令行編譯,運行go項目,包含好幾個go文件
go項目文件列表如下
進入go項目的目錄,並運行go build,生成exe文件,結果如下
最後運行可執行文件即可
運行內部包含多個 包的go項目
前面介紹瞭如何在命令行使用go命令編譯和運行包含多個go文件的項目。但是實際中的項目裡面往往是有多個包組成,即有一定的層級結構,劃分不同的功能(我是這麼理解的),有的用於配置Config包,有的用於數據模型生成data,有的用於服務service。直接用go build在項目根目錄是不好使的,出錯。項目的運行往往需要很多包,包括內部和外部的。這裡就可以用到go mod,管理項目依賴包,很好使。
介紹go module及區分go get
go get: 若是GOPATH設置的工程目錄,代碼在src目錄下,然後在命令提示符中輸入:go get github.com/astaxie/beego,這樣就在src目錄下生成瞭github.com/astaxie/beego包。註意:在使用GoLand工具時,配置settings->Go->GOPATH->Project GOPATH為當前工程目錄
值得一提的是,若是想要在其他位置新建go項目,就不得不更改系統變量GOPATH,將其設為新項目的位置,可能還要改goland中的GOPATH設置。比較麻煩。外部依賴包都存放在同一個位置,沒有項目私有的外部依賴包存放位置,不便於移植項目到連不上互聯網的電腦上。
go mod是golang1.11後引入的package依賴管理工具,用於解決之前沒有地方記錄依賴包具體版本的問題,方便依賴包管理。之前主要是用GOPATH 和 Vendor,vendor相對主流,但現在官方更提倡go mod。[3]
go module(mod):Go 的 1.11版本以上才能使用Go Module,1.13版本以下Go Module默認關閉,首先需要設置環境變量
go env -w GOPROXY=https://goproxy.io,direct go env -w GO111MODULE=on set GO111MODULE=on
在GOPATH的目錄下,新建項目文件夾,進入新建路徑執行go mod init,在文件夾下生成go.mod文件,然後將需要引入外部包的go文件置於項目目錄下,編譯文件,就會把外部包下載到本地的GOPATH/pkg/mod目錄下。
set GO111MODULE=off,GOPATH mode,查找vendor和GOPATH目錄。
set GO111MODULE=auto,如果當前目錄不在$GOPATH 並且 當前目錄(或者父目錄)下有go.mod文件,則使用 GO111MODULE, 否則仍舊使用 GOPATH mode。
註意:在使用GoLand工具時,不要配置Project GOPATH為當前工程目錄,最好不要配置Project GOPATH,而是配置Module GOPATH [2] 在使用模塊的時候, GOPATH 是無意義的,不過它還是會把下載的依賴儲存在 GOPATH/src/mod 中,也會把 go install 的結果放在 GOPATH/bin(如果 GOBIN 不存在的話)
相關命令[3]
1、指定module根目錄並生成go.mod文件
go mod init example.com/hello
2、下載並添加依賴到go.mod文件中
go build src/service go test src/sevice
3、查看module下的所有依賴
go list -m all
4、更新穩定版依賴
go get rsc.io/sampler
5、更新為指定版本依賴
go list -m -versions rsc.io/sampler rsc.io/sampler v1.0.0 v1.2.0 v1.2.1 v1.3.0 v1.3.1 v1.99.99 go get rsc.io/[email protected]
6、清理無用的依賴
go mod tidy
7、將依賴復制到項目路徑的vendor文件夾中
go mod vendor
8、忽略cache裡的包,隻使用vendor目錄裡的依賴進行編譯
go build -mod=vendor
9、校驗依賴並查看是否有修改
go mod verify
GoLand go module 配置
使用go module,依賴包存放於GOPATH下
優先級:global path < project path < module path
勾選enable module選項
保持不變
使用vendor
註意要使用命令行,並勾選vendor
type *http.Server has no field or method ProxyRemoteAddr
是下載好依賴後,編譯時老是出現上訴問題,說外部依賴包裡面有相關變量或方法沒定義。明明是網上下載的依賴包,自己又沒有修改,怎麼會出現編譯通不過的問題?
對於https://github.com/csby/wsf來說就是這樣,出現問題
後面發現在它的readme.md文件中已經有說明:
提示我們對源代碼作出以下修改。
按照它的提示修改後,編譯通過。go項目成功跑起來。
發現這些花瞭我一天多的時間。
命令行運行項目
項目結構
srv(config()、data()、 enum()、 handler()、 service()、go.mod)
為項目添加go.mod文件
go mod init srv
往go.mod裡面添加各個組件的依賴包
go build srv/config go build srv/data go build srv/enum go build srv/service
go run srv/servive
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- go中import包的大坑解決方案
- GoPath模式和GoMoudle模式的相愛相殺
- go自動下載所有的依賴包go module使用詳解
- GoLand安裝與環境配置的完整步驟
- win10下go mod配置方式