Go 中两个包依赖了同一个包的不同版本,怎么处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
keepeye

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

  •  
  •   keepeye Jan 31, 2019 8755 views
    This topic created in 2645 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

    import(
    v1 "github.com/v1"
    v2 "github.com/v2"
    )
    About     Help     Advertise     Blog     API     FAQ     Solana     1094 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 61ms UTC 22:54 PVG 06:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86