golang快速入門[7.1]-項目與依賴管理-gopath

前文

前言

  • 在以前文章中,咱們介紹了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%\g

  • gopath 能夠理解爲go語言的工做空間,內部存儲了src,bin,pkg 三個文件夾

go/
├── bin
├── pkg
└── src
  • $GOPATH/bin目錄存儲了經過go install 安裝的二進制文件。操做系統使用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語言的依賴管理與項目組織。

參考資料

相關文章
相關標籤/搜索