首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
V2EX  ›  Go

Go 中两个包依赖了同一个包的不同版本,怎么处理?

  •  
  •   keepeye · 78 天前 · 2093 次点击
    这是一个创建于 78 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果在项目中依赖了两个包 A 和 B,然后 A 和 B 又同时依赖 C 的不同版本, 这种情况下如何处理呢。

    go dep 是不是只支持一层 vendor ? 最新出来的 go module 能否解决这一问题呢?

    10 回复  |  直到 2019-01-31 21:34:48 +08:00
        1
    janxin   78 天前
    如果 A/B 没有直接暴露 C,可以直接放在对应的 vendor 下的 A/B 目录下

    go module 是可以解决跨版本问题的,不过也要看你的项目中用的 A/B 支持不支持呀...
        2
    victoriaraymond   78 天前
    Vendor 和 Module 都可以解决这个问题,Dep 没用过不知道。

    但这个问题会导致一个更深层的问题:假设 C 被依赖的两个版本分别 C1 和 C2,C1 和 C2 实际上是会被编译成不同的模块,即 Go 编译器不认为它们是同一份代码。当 C 中有一些全局变量时,这些变量在 C1 和 C2 中各有一份且互相独立,会产生一些奇怪的行为。

    Module 会通过尝试把 C1 和 C2 都升级到一个共同的版本来解决这个问题,但有时候因为兼容性的问题,并不能完美升级。
        3
    keepeye   78 天前
    @janxin

    是这样?
    vendor/A/vendor/C
    vendor/B/vendor/C

    go module 如果 A 和 B 中有 go.mod 文件的话,就能自动处理好么?
        4
    keepeye   78 天前
    @victoriaraymond 唉 就没有一个完美的解决办法么
        5
    Hellert   78 天前
    gomod 可以解决,import 时可以加上 vN 标记:import github.com/ms/pkg/v2, import github.com/ms/pkg/v3... 这样。
    前提是这个包要支持 gomod.

    如果不支持可以在 go.mod 中使用 replace 指令重定向到本地文件夹或其它路径。
        6
    keepeye   78 天前
    @Hellert 就算导入了不同的版本,go mod 还是只会采纳其中之一来作为最终使用的版本吧
        7
    reus   78 天前
    不兼容的版本,就应该有不同的 import path
    不遵守这种规则的包,应该抵制,不应该用
        8
    Hellert   78 天前
    @keepeye import .../.../vN 标记就是为了解决使用同一包的不同版本问题。
    即使同一个 .go 文件中也可以同时使用一个包的不同版本,指定导入别名就行了。

    如果包不支持 gomod,你也可以用 replace 指令来实现。
        9
    toma77   78 天前 via iPhone
    借楼问一下如何解决 go module 没有代码跳转?
        10
    xeaglex   78 天前
    使用别名:

    import(
    v1 "github.com/v1"
    v2 "github.com/v2"
    )
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   773 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 21:33 · PVG 05:33 · LAX 14:33 · JFK 17:33
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1