2017-09-20 56 views
2

我目前正在使用Golang開展一個私人項目(我對此很陌生)。Golang進口路徑最佳實踐

但我有問題,我不知道什麼是定義本地包import path的正確方法。

我有同樣的感覺,筆者從該鏈接https://medium.com/@c9s/golang-the-annoying-remote-import-path-c6c7e76517e5

總之,如果我在Github上主持一個項目foo。使用github.com/levin/foo作爲導入路徑而不是foo,我感到很奇怪。如果我將代碼移動到Bitbucket或者我在AWS中託管自己的git服務器,它會不會導致很多返工?

更糟糕的是,我可以重寫我的代碼來改變導入路徑,但是人們如何使用我的代碼在他們的通知repo的變化?我覺得要求別人更新他們的代碼是沒有意義的。

我是Golang的新手,所以可以隨意說「你的問題甚至不是有效的」。

+4

如果你想使用Go工具,你需要遵循約定。如果你想'去'工作,那麼你需要導入它的全名,否則把它放在任何你想要的GOPATH。 – JimB

回答

4

的回答你的問題:

I don't know what is the proper way to define the import path for local packages.

正如@JimB說:

If you want to use the Go tools you need to follow the conventions. If you want go get to work, then you need to import it with the full name, otherwise put it wherever you want in GOPATH

所以,你需要,如果你想go get工作使用完整的進口路徑github.com/levin/foo,你應該做的如果你希望其他人使用你的軟件包,這種方式。

回答你的第二個問題:

Wouldn't it cause much rework if I move my codes to Bitbucket or I host my own git server in AWS?

還有就是使用自定義域名作爲導入路徑,仍然無論你想託管代碼的方式,它被稱爲虛榮導入路徑我想。您只需將一些元標記添加到您使用的導入文件中獲取服務器的html文件即可。

This文章解釋瞭如何做到這一點,但總而言之,在訪問自定義導入路徑時在自定義域中獲取的文件中,您需要添加一個指向您託管代碼的位置的go-import元標記。本文使用github.com/foo/bar作爲您託管您的代碼的示例,並使用foo.com/bar作爲您真正的導入路徑。

所以在文件訪問foo.com/bar時被服務應該有這樣的meta標籤:

<meta name="go-import" content="golang.org/x/tools git http://github.com/foo/bar"> 

你繼續託管代碼在github上。然後,如果將主機位更改爲代碼,則只需更改元標記的值,但所有使用該程序包的代碼仍然使用完全相同的導入路徑"foo.com/bar

唯一的問題是,現在您的項目可以通過2個不同的路徑導入:foo.com/bargithub.com/foo/bar。爲了解決這個問題,他們有canonical imports只允許包使用自定義路徑,而不是GitHub的一個進口,它只是添加註釋旁邊的包名稱每個軟件包文件:

package bar // import "foo.com/bar" 

這是唯一的避免你遇到的問題。如果您正在使用只在本地使用的軟件包,則可以使用@srxf答案,只要知道該工具不會與該代碼一起工作(如go get)。如果您希望代碼按照預期工作,那麼這就是要走的路。

作爲一個評論,我知道這感覺傻進口github.com/levin/foo爲本地包,但如果你使用的是包在另一個包(比如foo2)和別人進口foo2,這允許編譯器知道到底從哪裏得到的依賴關係爲foo2,因爲代碼中的所有導入都包含整個路由,而不是本地文件的名稱。通過這種方式,人們可以隨時獲得所需的軟件包依賴關係,而無需將這些文件包含在您的軟件倉庫中,也無需配置任何軟件即可運行。這不是完美的,但它是行之有效的方式,他們稱之爲約定優於配置或類似的東西。

+0

謝謝@Topo,這是很高興知道:) – srf

+0

@頂部謝謝!我可能需要時間消化。 –

+0

@Topo假設我首先使用'github.com/foo/bar',後來我改爲'foo.com/bar'。此外,我在回購變更後使用規範導入。在其他人項目中究竟會發生什麼,最初的代碼是'import「github.com/foo/bar」'??? –

0

我們也在開發項目(私人)和我們是東道主它GitLab,我很清楚地知道,go get不會對私有倉庫很好地工作(至少就我所知)。

我們所做的是我們創建了一個文件夾,可以說$GOPATH/src/theproject並克隆該文件夾中的所有存儲庫。

到目前爲止,它對我們來說效果很好,但你也可能認爲這樣做很繁瑣,而且這是,但我們沒有其他辦法可以做到。我們通過使用git pull手動更新代碼。