导入外部服务的本地go模块
背景: 两个应用程序-导入外部服务的本地go模块,go,go-modules,Go,Go Modules,背景: 两个应用程序-A和B 应用程序“A”包含两个go.mod文件 A/pkg/test/go.mod:(我在这里保留了特定于应用程序的结构,这些结构将被其他愿意集成的服务重用) A/go.mod:(根模块作为本地模块导入pkg/test) 现在应用程序“B”希望通过简单地导入应用程序的Apkg/测试包来重用它 冒险之旅: 此解决方案允许任何集成服务只提取pkg/test模块的依赖项,而不是将整个应用程序导入树 当前解决方案: 应用程序“B”使用以下go.mod导入应用程序“A”的pkg/测试
A
和B
应用程序“A”
包含两个go.mod文件
A/pkg/test/go.mod:
(我在这里保留了特定于应用程序的结构,这些结构将被其他愿意集成的服务重用)
A/go.mod:
(根模块作为本地模块导入pkg/test)
现在应用程序“B”
希望通过简单地导入应用程序的A
pkg/测试包来重用它
冒险之旅:
此解决方案允许任何集成服务只提取pkg/test模块的依赖项,而不是将整个应用程序导入树
当前解决方案:
应用程序“B”
使用以下go.mod导入应用程序“A”的pkg/测试模块:
module B
go 1.14
require(
some_dependencies vx.x.x
A/pkg/test v0.0.0
)
replace A/pkg/test => gitlab.com/A/pkg/test v0.0.0-02345798575346-72cs44671e34
现在我真的不喜欢在这里使用commit-timestamp\u commit-sha方法
问题:
我想使用标签
导入/pkg/test模块。
存储库A创建了一个标记,比如v2.0.0。当我用v2.0.0
替换v0.0.0-02345798575346-72cs44671e34
时,在运行go mod tidy/download
后,我得到以下错误输出:
reading gitlab.com/A/pkg/test/pkg/test/go.mod at revision pkg/test/v2.0.0: unknown revision pkg/test/v2.0.0
问题:
我认为错误的包命名/模块命名/标记等可能导致此类错误。问题是为了让它清晰和有效,我在这里遗漏了什么?要在git repo中获取嵌套的go模块包,只需在包含
go.mod
文件的目录中添加一个标记,然后附加您的版本
因此,在您的情况下,目录是A/pkg/test
,假设您想使用semverv0.0.1
这样标记:
git标签-a“a/pkg/test/v0.0.1”-m“初始测试签入”
git push origin--标记#推送所有本地标记
#git推送原点“A/pkg/test/v0.0.1”#推送单个标签
请注意:来自Go wiki的Russ Cox(vgo的创建者,即今天的Go模块)警告: 对于除超级用户以外的所有用户,您可能希望采用通常的方法 约定一个回购=一个模块。这对长期发展很重要 回购协议可以包含多个代码存储选项的演变 模块,但这几乎肯定不是你想要做的事情 默认
除了下面的答案外,请阅读/理解-因此不要从
v2
开始,而是从v0
开始,慢慢过渡到v1
的成熟状态v2
表示一个与所有以前版本不兼容的突破性更改-因此应该非常认真地对待切换-请注意,您的优势不是一个。@colm.anseo我知道,但感谢您指出这一点,并发送了一篇很好的文章-可能对任何处理类似问题的人都非常有用issue@Volker你能详细说明一下这不是什么优势吗?这是我决定这样设计它的主要原因,我很想听听计数器的观点。@电源依赖性很便宜。特别是没有编译成二进制文件的测试依赖项。Go不是节点。
module B
go 1.14
require(
some_dependencies vx.x.x
A/pkg/test v0.0.0
)
replace A/pkg/test => gitlab.com/A/pkg/test v0.0.0-02345798575346-72cs44671e34
reading gitlab.com/A/pkg/test/pkg/test/go.mod at revision pkg/test/v2.0.0: unknown revision pkg/test/v2.0.0