Golang供应商包和供应商子包
情况: 假设我有一个名为Golang供应商包和供应商子包,go,govendor,Go,Govendor,情况: 假设我有一个名为mypackage的包。它公开了一个名为Build()的方法,该方法返回由名为thirdpartypackage的第三方库公开的具体结构,例如如下所示: package mypackage import tpp "github.com/thirdpartycompany/thirdpartypackage" func Build() *tpp.SharedStruct{ //...implementation } 公开SharedStruct的包在mypack
mypackage
的包。它公开了一个名为Build()
的方法,该方法返回由名为thirdpartypackage
的第三方库公开的具体结构,例如如下所示:
package mypackage
import tpp "github.com/thirdpartycompany/thirdpartypackage"
func Build() *tpp.SharedStruct{
//...implementation
}
公开SharedStruct
的包在mypackage
中出售,因为我想分发它并使该包独立
问题:
将mypackage
导入另一个项目并在我的(集成)测试中使用thirdpartypackage
后,我得到以下错误:
无法使用XXXX(类型
“github.com/mycompany/mymainproject/vendor/github.com/mycompany/mypackage/vendor/github.com/thirdcompany/thirdpartypackage go.Token)
as类型
“github.com/empatica/mycompany/vendor/github.com/thirdcompany/thirdpartypackage”
基本上,编译器是在区分库中的第三方软件包和我放在主项目中的第三方软件包
问题:
有没有办法解决这个问题,不从我的库中删除供应商依赖项,就像建议的那样?我遗漏了什么吗?我想你遗漏的是这一点: 名为“vendor”的目录下的代码只能通过根在“vendor”父目录下的目录树中的代码导入,并且只能使用一个导入路径来导入,该路径省略了包含vendor元素的前缀。() 我从您的问题中了解到的是,您的
mypackage
将供应商作为其子项,因此,当它被任何其他处于相同级别的包导入时,显然他们无法看到供应商列表
您可以将其理解为类似于受保护的功能
因此,如果您想在任何其他软件包中使用该版本,则此供应商
应在同一级别。比如说
ParentDirectory
> mypackage
> otherpackage (this will be importing mypackage)
> vendor (vendor should be present in here so that all children under ParentDirectory can access this)
我希望我的观点是清楚的。自动售货机对命令有效,而对单个软件包无效……你能给出你的确切目录结构吗?你的观点不清楚这就是为什么大多数自动售货机工具会将供应商目录展平。Govendor默认情况下会这样做,我不确定是否有其他供应商工具。我开始使用的用于导入的库(与应用程序本身相反)的范例是将
/vendor/*/
添加到我们的.gitignore
。这会忽略/vendor/
中的子文件夹,但不会忽略文件(如用于govendor的vendor.json
)。Govendor然后优雅地处理展平依赖关系树,您的错误消失,因为两个包现在对结构的包使用相同的完全限定导入路径。