2016-07-26 67 views
5

我在寫應用程序並導入一些包B。該軟件包有vendor目錄,其中又包含軟件包C。我也想直接在我的應用中使用該包C如何在Go包中處理嵌套的「供應商」目錄?

所以我決定使用glide包管理器。它將BC下載到myapp/vendor目錄中,但保留myapp/vendor/B/vendor/C。因此,當我構建我的應用程序時,它會使用兩個不同版本的C構建(也適用於myapp/vendor/C)。

如何避免這種情況?

1)是否有包管理器來處理? govend似乎與它的--prune論點,但它不尊重這些C包的版本。

2)或者,如何使glide正確處理嵌套的vendor目錄?

編輯

我的例子是https://github.com/orloffm/flat。它使用cat和 - 間接 - toy包。 cat有一些舊版本toy已售賣並已提交到存儲庫。我做glide create && glide install以及與此結束:

. 
├── flat.go 
├── glide.lock 
├── glide.yaml 
└── vendor 
    └── github.com 
     └── orloffm 
      ├── cat 
      │   ├── cat.go 
      │   ├── vendor 
      │   │   └── github.com 
      │   │    └── orloffm 
      │   │     └── toy 
      │   │      └── toy.go 
      │   └── vendor.yml 
      └── toy 
       └── toy.go 

我不想嵌套vendor目錄與toy

+0

我現在不使用'glide',但是你確定你有最新版本嗎?快速瀏覽一下文檔顯示''因爲這個Glide將依賴關係樹平化爲一個頂級供應商/目錄。「# – JimB

+0

正如JimB所說,我使用的大多數當前的銷售工具都會自動將依賴關係樹展平。這實際上是必需的,因爲從兩個不同的唯一路徑導入的相同包實際上被視爲兩個不同的唯一包,就像您發現的那樣。我知道'govendor'默認是這樣做的。 – Kaedys

+0

@Kaedys +1爲govendor。我已經在很多項目中使用過它。 – tier1

回答

2

我能夠通過以下的改變(也送你一個PR https://github.com/orloffm/flat/pull/1)安裝和運行您的程序flat

1)flat.go需要進口「github.com/orloffm/toy」,因爲的new(toy.RubberToy) - 否則它不會編譯

2)添加glide.yaml文件同時列出「貓」和「玩具」庫作爲依賴:

package: github.com/orloffm/flat 
import: 
- package: github.com/orloffm/cat 
- package: github.com/orloffm/toy 

3)運行glide install --strip-vcs --strip-vendor(或當量alent快捷鍵glide install -s -v)安裝軟件包並刪除嵌套的vendor/目錄(我使用glide version 0.11.0-dev與go get -u github.com/Masterminds/glide一起安裝; glide install --help顯示--strip-vendor選項)。

4)GOBIN = $ PWD去安裝& & ./flat產生

Cat pushes the toy. 
The toy makes a very loud noise. 

我認爲最好是爲包括vendor目錄到您的 - 這個食堂的事情了和使圖書館用戶的生活變得更加困難(例如,需要記住使用glide的附加選項)。讓這些庫的「客戶端」包(package main包) - 或者向所有依賴項(包括可傳遞的依賴項)提供商,或者在諸如glide.yaml之類的配置中指定它們,並讓工具(滑動條)正確提取並安裝它們。

+0

把事情排序出來,非常感謝。把它與其他所有工具比較,我有點困惑。 –