golang 快速入門 [7.1]-專案與依賴管理-gopath
前文
- golang 快速入門 [1]-go 語言導論
- golang 快速入門 [2.1]-go 語言開發環境配置-windows
- golang 快速入門 [2.2]-go 語言開發環境配置-macOS
- golang 快速入門 [2.3]-go 語言開發環境配置-linux
- golang 快速入門 [3]-go 語言 helloworld
- golang 快速入門 [4]-go 語言如何編譯為機器碼
- golang 快速入門 [5.1]-go 語言是如何執行的-連結器
- golang 快速入門 [5.2]-go 語言是如何執行的-記憶體概述
- golang 快速入門 [5.3]-go 語言是如何執行的-記憶體分配
- golang 快速入門 [6.1]-整合開發環境-goland 詳解
- golang 快速入門 [6.2]-整合開發環境-emacs 詳解
- golang 快速入門 [7.1]-專案與依賴管理-gopath
- golang 快速入門 [7.2]-北冥神功—go module 絕技
- golang 快速入門 [8.1]-變數型別、宣告賦值、作用域宣告週期與變數記憶體分配
- golang 快速入門 [8.2]-自動型別推斷的祕密
前言
- 在之前文章中,我們介紹了 go 語言開發環境的配置
- 在本章中,我們將介紹 go 語言的專案結構、專案管理以及依賴管理。在本文中,我們關注
gopath
## gopath 是什麼 - 在 go 語言開發環境配置文章中,我們介紹了配置
gopath
與goroot
環境變數的步驟,但是並沒有對其進行深入解釋。可以在終端輸入go env
或者go env gopath
檢視具體的配置C:\Windows\system32> go env set GO111MODULE= set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\jackson\AppData\Local\go-build set GOENV=C:\Users\jackson\AppData\Roaming\go\env set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GONOPROXY= set GONOSUMDB= set GOOS=windows set GOPATH=C:\Users\jackson\go set GOPRIVATE= set GOPROXY=https://proxy.golang.org,direct set GOROOT=c:\go ...
- 在 go1.8 之後,如果不指定 gopath,則 gopath 是預設的。
- 在 mac,linux 下為
$HOME/go
- windows 下為
%USERPROFILE%\go
- 在 mac,linux 下為
-
gopath
可以理解為 go 語言的工作空間,內部儲存了src
,bin
,pkg
三個資料夾go/ ├── bin ├── pkg └── src
$GOPATH/bin
目錄儲存了通過go install
安裝的二進位制檔案。作業系統使用 $PATH 環境變數來查詢無完整路徑即可執行的二進位制應用程式。建議將此目錄新增到全域性 $PATH 變數中$GOPATH/pkg
目錄中,會儲存預編譯的 obj 檔案 (檔名根據作業系統的不同而不同,例如 mac 下為darwin_amd64
),以加快程式的後續編譯。大多數開發人員不需要訪問此目錄。後面還會介紹,pkg 下的 mod 檔案還會儲存go module
的依賴。$GOPATH/src
目錄 儲存我們專案的 go 程式碼。通常包含許多版本控制儲存庫(例如,由 Git 管理),每個儲存庫都包含了一個或多個 package,每個 package 都在一個目錄中包含一個或多個 Go 原始檔。-
因此,整個路徑看起來像是:
go/ ├── bin └── main.exe ├── pkg ├── darwin_amd64 └── mod └── src ├── github.com │ ├── tylfin │ │ ├── dynatomic │ │ └── geospy │ └── uudashr │ └── gopkgs └── golang.org └── x └── tools
-
gopath 具有多個作用,當我們想從 github 或其他地方獲取 go 專案程式碼時,我們可以使用
go get
指令。 此時程式會預設的將程式碼儲存到$GOPATH/src
目錄中。例如拉取go get github.com/dreamerjackson/theWayToGolang
時,目錄結構如下:go/ ├── bin ├── pkg └── src └── github.com └── dreamerjackson └── theWayToGolang
當我們使用
go get
的-u
引數時,會將該專案以及專案所依賴的所有其他專案一併下載到$GOPATH/src
目錄中-
gopath 的另一個功能是明確 package 的匯入位置。前文我們介紹過,go 程式碼通過 package 進行組織,在 helloworl 程式中,我們匯入了 go 語言內建的
fmt
package.當我們要匯入第三方時應該怎麼做呢?其實如果我們在專案中匯入了一個第三方包,例如import "blue/red"
實際引用的是
$GOPATH/src/blue/red
檔案中的程式碼。
同理,如果匯入為
import "github.com/gobuffalo/buffalo"
實際引用的是$GOPATH/src/github.com/gobuffalo/buffalo
檔案中的程式碼。
下面我們用一個例子來說明匯入第三方包
- 首先在
$GOPATH/src
中新建一個資料夾mymath
,在資料夾中新建一個檔案add.go
» mkdir mymath
» cd mymath
» touch add.go
add.go 的內容如下,要注意匯出的函式必須是首字母大寫的,這是 go 語言的規則。
package mymath
func Add(a int, b int) int {
return a + b
}
接著在$GOPATH/src
中建立一個 main.go 檔案,即可以完整的呼叫mymath
包中的add
函式。
package main
import (
"fmt"
"mymath"
)
func main() {
result := mymath.Add(1, 2)
fmt.Println("result:", result)
}
- 通過
go run main.go
即可執行輸出1+2
的結果3
gopath 的優劣
- 相比於其他語言繁瑣的配置,go 語言中的工作空間
gopath
配置相對簡單,容易理解 - gopath 使得在檔案系統組織整個程式碼更加簡潔、結構化,但是限制在單一的工作空間中。
- gopath 並沒有解決版本依賴的問題,而將其留給了其他工具去實現。正因為如此,gopath 中的程式碼就是一個唯一的 master 分支,並且強制使用各個模組最新的程式碼。
總結
- 本文介紹了 gopath 的含義、功能、優劣、以及如何通過 GOPATH 來組織專案,匯入第三方庫。
- 在 go1.13 之後,go 官方已經開始全面擁抱
go module
.我們在下文中,將介紹go module
的原理和用法,以及如何通過go module
進行 go 語言的依賴管理與專案組織。
參考資料
喜歡本文的朋友歡迎點贊分享~
唯識相鏈啟用微信交流群(Go 與區塊鏈技術)
歡迎加微信:ywj2271840211
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 使用godep管理Golang專案依賴Golang
- 使用govendor管理Golang專案依賴Golang
- Maven快速入門(五)Maven的依賴管理Maven
- golang 依賴管理Golang
- 分散式專案中,選型與依賴管理分散式
- Gradle入門系列(3):依賴管理Gradle
- 入門系列-依賴注入依賴注入
- 專案管理中,如何識別和管理依賴關係?專案管理
- golang快速入門(四)Golang
- Golang專案的配置管理——Viper簡易入門配置Golang
- Golang入門-Golang包管理Golang
- 依賴管理和依賴範圍
- 搭建react專案常用依賴React
- Golang語言檔案操作快速入門篇Golang
- 拜拜了,GOPATH君!新版本Golang的包管理入門教程Golang
- IDEA中Maven顯示存在依賴但專案中並未匯入依賴JARIdeaMavenJAR
- Maven中如何管理多模組專案的依賴關係Maven
- 如何管理前端專案中的複雜依賴關係前端
- idea gradle 專案依賴IdeaGradle
- Pipenv:新一代Python專案環境與依賴管理工具Python
- Maven依賴管理:控制依賴的傳遞Maven
- Semantic Kernel入門系列:透過依賴注入管理物件和外掛依賴注入物件
- 什麼是專案管理中的任務依賴關係專案管理
- 在python專案的docker映象裡使用pdm管理依賴PythonDocker
- 依賴倒置(DIP)與依賴注入(DI)依賴注入
- 【Springboot】在Idea的Maven專案匯入依賴Spring BootIdeaMaven
- 為你的專案依賴加星
- 在iOS專案中依賴Flutter Module-②遠端依賴Git資源iOSFlutterGit
- govendor依賴包管理Go
- Python 專案及依賴管理工具技術選型Python
- 探索 JavaScript 中的依賴管理及迴圈依賴JavaScript
- Kafka 入門(三)--為什麼 Kafka 依賴 ZooKeeper?Kafka
- 專案管理軟體中什麼是依賴管理,具體有什麼作用?專案管理
- golang 快速入門 [8.4]-常量與隱式型別轉換Golang型別
- SSM匯入依賴SSM
- 如何建立依賴專案工程--android moduleAndroid
- 普通maven專案將依賴包打包方法Maven
- Android專案的依賴關係解析Android