gopath基礎概念

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

GOROOT

golang安裝路徑。

GOPATH

官方解釋,請google。go工作環境中常常用到的一個很重要的環境變數(這種設計類似java)。具體用途:go命令常常需要用到的,如go run,go install, go get等。允許設定多個路徑,和各個系統內容多重路徑設定一樣,windows用“;”,linux(mac)用“:”分隔。

在linux(Mac)下,為了方便,一般配置在~/.bash_profile中。

book:~ wukebing$ vi ~/.bash_profile  //編輯

book:~ wukebing$ source ~/.bash_profile //編輯完成後,使立即生效

例如:我的GOPATH設定(MAC下)

export GOPATH=$HOME/workspace/goexport PATH=$PATH:${GOPATH//://bin:}/binexport GOBIN=

其中,“export PATH=$PATH:${GOPATH//://bin:}/bin”為Linux(Mac)下把每個GOPATH下的bin都加入到PATH中。

當存在多個路徑時,好像優先採用第一個路徑。這個無關緊要了,只有需要的第三方包(庫)都能正確下載和使用就ok了。

GOBIN

go install編譯存放路徑。不允許設定多個路徑。可以為空白。為空白時則遵循“約定優於配置”原則,可執行檔放在各自GOPATH目錄的bin檔案夾中(前提是:package main的main函數檔案不能直接放到GOPATH的src下面。

go環境查看

用go env 可查看當前go環境變數。

GOPATH目錄結構

goWorkSpace  // (goWorkSpace為GOPATH目錄)  -- bin  // golang編譯可執行檔存放路徑,可自動產生。  -- pkg  // golang編譯的.a中間檔案存放路徑,可自動產生。  -- src  // 源碼路徑。按照golang預設約定,go run,go install等命令的當前工作路徑(即在此路徑下執行上述命令)。

go目錄結構1:

project1 // (project1添加到GOPATH目錄了)  -- bin  -- pkg  -- src       -- models       // package     -- controllers  // package     -- main.go      // package main[注意,本文所有main.go均指包main的入口函數main所在檔案]
 project2 // (project2添加到GOPATH目錄了)      -- bin      -- pkg      -- src         -- models       // package         -- controllers  // package         -- main.go      // package main
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

package main檔案直接在GOPATH目錄到src下。

使用go build可以在src檔案夾下編譯產生名為“src”的可執行檔。這是golang預設約定。一般我個人不怎麼用這個命令。因為它會產生可執行檔在src目錄下面。

我一般用:go get 和 go install。

go get [main.go所在路徑]

參數 [main.go所在路徑]:可選。相對GOPATH/src路徑。 預設是.(src自己)。可指定src下面的子檔案夾路徑。 
go get會做2件事:1. 從遠程下載需要用到的包。2.執行go install。(從這裡也可以看出golang處處為了簡潔而遵循的“約定優於配置”原則)

go install [main.go所在路徑]

參數 [main.go所在路徑]:可選。 相對GOPATH/src路徑。預設是.(即當前所在目錄或工作目錄)。可指定src下面的子檔案夾。 
go install編譯產生名稱為[main.go父資料夾名]的可執行檔,放到GOBIN路徑下。當GOBIN為空白時,預設約定是:產生的可執行檔放到GOPATH/bin檔案夾中。產生的中間檔案(.a)放在project/pkg中(沒有變化時,不重建.a)。

我們再看此go目錄結構1,執行go install(以及go get的第二階段go install)會報錯:

注意:如果不用額外方式改變環境變數(公司目前用的是sh指令碼編譯),是編譯不過的。報錯:can’t load package: package .: no buildable Go source files in *

解決方案1: 
曾經我也因為這個錯誤感到迷惑,認為所有都環境變數都沒有問題。網上也沒怎麼看到直接明確都解答。看了一些文章後,觸類旁通,設定了GOBIN環境變數後解決。(好吧,我至今也沒有完整讀過英文官方文檔。這種預設約定,官方文檔上應該有。)

此解決方案有個弊端,多個project會導致多個GOPATH目錄。多個project下的目錄結構和包一致的話,直接編譯會導致編譯問題。因為go優先使用第一個GOPATH目錄,導致編譯衝突。(當然,你也可以每次手工或腳步修改GOPATH環境變數,感覺很麻煩。)不建議多個project直接設定到茫茫多的GOPATH中。當然有解決方案2,我認為是標準合理的解決方案,就是下面go目錄結構2了。

go目錄結構2:

goWorkSpace     // goWorkSpace為GOPATH目錄  -- bin     -- myApp1  // 編譯產生     -- myApp2  // 編譯產生     -- myApp3  // 編譯產生  -- pkg  -- src     -- common 1     -- common 2     -- common utils ...     -- myApp1     // project1        -- models        -- controllers        -- others        -- main.go      -- myApp2     // project2        -- models        -- controllers        -- others        -- main.go      -- myApp3     // project3        -- models        -- controllers        -- others        -- main.go 

一個solution裡面的多個project或工具組件都並列放在GOPATH的src下,如myApp1,myApp2,myApp3,common utils。 
這時,GOBIN可以為空白,編譯時間,可以如下: 
go install myApp1 或 go get myApp1 
go install myApp2 或 go get myApp2 
go install myApp3 或 go get myApp3

這時才是大家都認為的,把可執行程式myApp1、myApp2、myApp3產生在goWorkSpace/bin下面。多個GOPATH也就有了上面的“把每個GOPATH下的bin都加入到PATH中”。

提示:相同結構的project下同名包怎麼辦? 
有同事在初學時,習慣按照go目錄結構1,瞭解到go目錄結構2後(以為僅僅是把main放到了子檔案夾,其他controllers等包結構不變),有這樣的疑惑。他們原來就有這樣的問題,同時把go目錄加入到GOPATH後,編譯就出現問題,因為包名和路徑相同(相對GOPATH下的src),go只會優先尋找第一個符合的GOPATH)。只會每次編譯時間手工修改GOPATH,或寫指令碼編譯。(我看著就覺得累,還徒增指令碼維護煩惱。)

解決方案就是:除了通用的,公有的工具、組件外,屬於各個project自己的東西,統統隨著main.go一起移到project目錄下。go目錄結構2就是這樣的。 
匯入各個project下的controllers方法:import myApp1/controllers,import myApp2/controllers這樣的。go的import尋找的是包的路徑,並不是包名。你只用告訴go,你的包都放在哪了,go會從這些路徑下尋找有沒有所需要的包。只是大家一般習慣包名和檔案夾名相同,容易誤解。只需要注意,一個檔案夾下只允許有一個包名,允許有子檔案夾定義不同的包。 
import 採用的是相對路徑寫法:路徑是 相對GOROOT和GOPATH下的src。

也可以設定GOBIN,而且這時,由於可執行檔名稱不同,也不大容易產生覆蓋(需要避免的時多個GOPATH用相同的“myApp”project名稱。)

具體的還是看個人喜好和實際情況。我個人本地的環境大致是:

dir        -- goWorkSpace1    // 主要是為了區分自己的鼓搗的一些東西和工作上的項目  -- goWorkSpace2        -- bin        -- pkg        -- src                             -- myApp1              -- .git              -- models              -- controllers              -- main.go            -- myApp2              -- .git              -- models              -- controllers              -- main.go            -- myApp3              -- .git              -- models              -- controllers              -- main.go

也就是我本地是有多個GOPATH路徑的dir/goWorkSpace1、dir/goWorkSpace2。 
注意:GOPATH目錄和GOPATH下的src不應該添加到原始程式碼控制中,而是各個project目錄myApp1、myApp2、myApp3各自時獨立的進行原始程式碼控制

我一般不設定GOBIN,把每個GOPATH下的bin都加入到PATH中。

摘錄自:http://blog.csdn.net/Alsmile/article/details/48290223

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.