2013-07-09 30 views
87

我已經使用GOPATH,但對於這個目前我遇到的問題沒有幫助。我希望能夠創建一個特定於某個項目包:Golang如何導入沒有gopath的本地軟件包?

myproject/ 
├── binary1.go 
├── binary2.go 
├── package1.go 
└── package2.go 

我試過多種方法,但我如何才能package1.gobinary1.gobinary2.go等工作?

例如;我希望能夠import "package1",然後能夠運行go build binary1.go和一切工作正常,沒有錯誤被拋出的包無法找到GOROOTGOPATH。我需要這種功能的原因是大型項目;我不想引用多個其他軟件包或將它們保存在一個大文件中。

+2

你應該把每個二進制文件的源文件放到它自己的目錄中。 – fuz

回答

103

編輯2:售貨方法仍然有效,沒有問題。 vendor是事實上管理項目的方式。然而,這主要是一個手動過程,因爲這個新工具已經出來爲您管理您的供應商軟件包:dep

depwill be part of the toolchain in the future;這不是我推薦的第三方工具。這是未來:)。這是一個非常簡單的工具,請參閱documentation


編輯1:雖然我的舊方法的作品,它不再是「正確」的方式來做到這一點。您應該在Go 1.6中使用默認啓用的供應商功能; see。你基本上在vendor目錄中添加你的「外部」或「依賴」包;編譯後編譯器將首先使用這些軟件包。


找到。我可以導入本地包GOPATH通過創建package1一個子文件夾,然後用import "./package1"binary1.go進口和binary2.go腳本是這樣的:

binary1.go

... 
import (
     "./package1" 
    ) 
... 

所以我的當前目錄結構如下所示:

myproject/ 
├── binary1.go 
├── binary2.go 
├── package1/ 
│ └── package1.go 
└── package2.go 

我也應該注意到,相對路徑(至少在1.5)也可以;例如:

import "../packageX" 
+3

這工作正常,直到你有兩個子文件夾與一個引用到另一個。例如,如果package2也是一個子文件夾,並且它需要package1,則系統會中斷。 – Carl

+6

'import「../ package1」' –

+8

相對導入路徑是[壞主意](https://golang.org/cmd/go/#hdr-Relative_import_paths)。 –

42

沒有「本地包」這樣的東西。磁盤上軟件包的組織與任何軟件包的父/子關係是正交的。由軟件包形成的唯一真正的層次結構是依賴關係樹,在一般情況下它不反映目錄樹。

只需使用

import "myproject/packageN" 

不打構建系統沒有很好的理由。在任何非平凡的程序中爲每個導入保存十幾個字符並不是一個好的理由,因爲例如具有相對導入路徑的項目是不可獲取的。

的進口路徑的概念有一些重要的特性:

  • 導入路徑可以是全局唯一的。
  • 結合GOPATH,導入路徑可以毫不含糊地轉換爲目錄路徑。
  • GOPATH下的任何目錄路徑都可以毫不含糊地轉換爲導入路徑。

以上所有情況都是通過使用相對導入路徑來破壞的。不要做。

PS:在Go編譯器測試中使用相對導入的遺留代碼中很少有地方。自動櫃員機,這是爲什麼支持相對進口的唯一原因。

+1

開頭我建議查看此介紹視頻以更好地瞭解**包**和** GOPATH **。 https://www.youtube.com/watch?v=XCsL89YtqCs –

+4

我認爲這是不好的建議。例如,如果最終使用gopkg.in進行版本控制,那麼如上所述,對於「迷你」版本而言,絕對不會有輸入路徑。要麼打破源代碼回購,要麼版本化的回購變得毫無用處。 – Greg

+0

'import「myproject/packageN」'。 'myproject'是保存我的項目的文件夾名稱? – securecurve

30

也許你正試圖模塊化你的軟件包。我假設package1package2在某種程度上是同一個軟件包的一部分,但爲了便於閱讀,您將它們分成多個文件。

如果上一個案例是你的,你可以在這些多個文件中使用相同的包名稱,就像是有相同的文件一樣。

這是一個例子:

add.go

package math 

func add(n1, n2 int) int { 
    return n1 + n2 
} 

subtract.go

package math 

func subtract(n1, n2 int) int { 
    return n1 - n2 
} 

donothing.go

package math 

func donothing(n1, n2 int) int { 
    s := add(n1, n2) 
    s = subtract(n1, n2) 
    return s 
} 

我不是一個圍棋高手和這是我在StackOveflow中的第一篇文章,所以如果你有一些建議,它會很受歡迎。

3

要將「本地」包添加到項目中,請添加一個文件夾(例如「package_name」)。並把你的實現文件放在那個文件夾中。

src/github.com/GithubUser/myproject/ 
├── main.go 
└───package_name 
     └── whatever_name1.go 
     └── whatever_name2.go 

在你package main做到這一點:

import "github.com/GithubUser/myproject/package_name" 

哪裏package_name是文件夾名稱,它必須在文件中使用的包名稱相匹配whatever_name1.go和whatever_name2.go。換句話說,所有帶有子目錄的文件應該是相同的包。

只要您指定導入中父文件夾的完整路徑,就可以進一步嵌套更多子目錄。

相關問題