2016-07-26 82 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

把事情排序出来,非常感谢。把它与其他所有工具比较,我有点困惑。 –