golang 快速入門 [7.1]-專案與依賴管理-gopath

weishixianglian發表於2020-03-24

前文

前言

  • 在之前文章中,我們介紹了 go 語言開發環境的配置
  • 在本章中,我們將介紹 go 語言的專案結構、專案管理以及依賴管理。在本文中,我們關注gopath ## gopath 是什麼
  • 在 go 語言開發環境配置文章中,我們介紹了配置gopathgoroot環境變數的步驟,但是並沒有對其進行深入解釋。可以在終端輸入 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
  • 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

更多原創文章乾貨分享,請關注公眾號
  • golang 快速入門 [7.1]-專案與依賴管理-gopath
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章