2016-02-28 67 views
1

我的$ GOPATH是Golang相關包裝進口

"/Users/peter/goworkspace" 

我現在golang版本:

go version go1.6 darwin/amd64 

我有這個工作區在多個golang項目,所以這裏是目錄

的結構
+/goworkspace 
    +---/bin 
    +---/pkg 
    +---/src 
    +---/project1 
     +---package1 
      +---file1.go 
      +---file2.go 
      +---file3.go 
     +---package2 
     +---package3 
     +---main.go 
    +---/project2 
    +---/project3 

在我的proj1的main.go中,我將使用這個p下的其他包的導入roject,它看起來像:

import( 
    "./package1"  
    "./package2"  
    "./package3" 
) 

但是當我跑「去建造」,我讓越來越錯誤說:
無法加載包:本地進口」 ../package」在非本地包

如果我不喜歡使用相對包路徑,例如用它喜歡:

import(
    "project1/package1" 
    "project1/package2" 
    "project1/package3" 
) 

那麼一切都將正常工作。

如果我使用相對包路徑,我的代碼有什麼問題?
如果項目1的名稱將在未來發生變化,那麼包導入的最佳做法是什麼?例如將其更改爲projecet1v2?
我需要手動更新導入的軟件包名稱嗎?

回答

4

規則1:不要使用相對導入。這是(部分)爲什麼你遇到問題。通讀這一點:https://golang.org/doc/code.html#Library

使用完全合格的進口路徑(如你顯示):

import(
    "project1/package1" 
    "project1/package2" 
    "project1/package3" 
    // Or ideally, so others can access it in the future: 
    "github.com/<yourusername>/project1/package4" 
) 

如果由於某種原因,你想版本的包,你可以:

  • 提供新的存儲庫(進口URL)
  • 使用像gopkg.in(http://labix.org/gopkg.in)的服務將提供版本進口網址(如gopkg.in/you/pkgname.v2)
+0

如果需要我必須將project1重命名爲project1v2,那麼該怎麼辦?在進口我必須更新它,對吧?有沒有什麼好的解決方案,所以我不需要手動更新它們?這也是我在這裏使用相對導入的原因。 – mikero

+1

您不應該將其重命名爲v2。分叉它/複製它,然後創建第二個新的包作爲v2(這樣v1用戶仍然可以使用v1,直到他們可以升級而不會破壞他們的程序)。 – elithrar

+0

哦,這是我一生中golang最糟糕的部分:( – rox