如果在项目中依赖了两个包 A 和 B,然后 A 和 B 又同时依赖 C 的不同版本, 这种情况下如何处理呢。
go dep 是不是只支持一层 vendor ? 最新出来的 go module 能否解决这一问题呢?
1
janxin 2019-01-31 17:31:09 +08:00
如果 A/B 没有直接暴露 C,可以直接放在对应的 vendor 下的 A/B 目录下
go module 是可以解决跨版本问题的,不过也要看你的项目中用的 A/B 支持不支持呀... |
2
victoriaraymond 2019-01-31 17:36:12 +08:00
Vendor 和 Module 都可以解决这个问题,Dep 没用过不知道。
但这个问题会导致一个更深层的问题:假设 C 被依赖的两个版本分别 C1 和 C2,C1 和 C2 实际上是会被编译成不同的模块,即 Go 编译器不认为它们是同一份代码。当 C 中有一些全局变量时,这些变量在 C1 和 C2 中各有一份且互相独立,会产生一些奇怪的行为。 Module 会通过尝试把 C1 和 C2 都升级到一个共同的版本来解决这个问题,但有时候因为兼容性的问题,并不能完美升级。 |
3
keepeye OP |
4
keepeye OP @victoriaraymond 唉 就没有一个完美的解决办法么
|
5
Hellert 2019-01-31 18:25:48 +08:00
gomod 可以解决,import 时可以加上 vN 标记:import github.com/ms/pkg/v2, import github.com/ms/pkg/v3... 这样。
前提是这个包要支持 gomod. 如果不支持可以在 go.mod 中使用 replace 指令重定向到本地文件夹或其它路径。 |
7
reus 2019-01-31 18:31:22 +08:00
不兼容的版本,就应该有不同的 import path
不遵守这种规则的包,应该抵制,不应该用 |
8
Hellert 2019-01-31 18:37:22 +08:00
@keepeye import .../.../vN 标记就是为了解决使用同一包的不同版本问题。
即使同一个 .go 文件中也可以同时使用一个包的不同版本,指定导入别名就行了。 如果包不支持 gomod,你也可以用 replace 指令来实现。 |
9
toma77 2019-01-31 20:29:53 +08:00 via iPhone
借楼问一下如何解决 go module 没有代码跳转?
|
10
xeaglex 2019-01-31 21:34:48 +08:00
|