不懂就问,关于 Go 的包管理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
gramyang
V2EX    Go 编程语言

不懂就问,关于 Go 的包管理

  •  
  •   gramyang 2019 年 6 月 13 日 5165 次点击
    这是一个创建于 2431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Go 官方推荐,很多人也爱这么写,就是在 import 时直接写 github 地址。不同于 Java 里面下载 jar 包,而是实时从 github 上下载代码。

    问题来了,如果 github 上的代码被修改,或者更新了,导致功能变更或者代码结构变更怎么办? go 可以像 Java 一样导入某一个版本的代码吗?

    第 1 条附言    2019 年 6 月 13 日
    关于 go mod 有一个更简单的方法,在 goland 上设置 vgo,代理写 https://goproxy.io ,项目放在 gopath 外面,然后 sync,速度飞起
    30 条回复    2019-06-17 23:31:51 +08:00
    Cbdy
        1
    Cbdy  
       2019 年 6 月 13 日 via Android   1
    使用 go mod
    acehow
        2
    acehow  
       2019 年 6 月 13 日 via Android
    不是实时的吧,要先用 go get 命令拉下来的。包管理的话,可以有 go mod init 生成一个文件,里面会有依赖的包版本,但也要看 github 上标签的质量。
    xiri
        3
    xiri  
       2019 年 6 月 13 日 via Android
    现在可以用 go mod,默认会记录版本号
    mritd
        4
    mritd  
       2019 年 6 月 13 日 via iPhone
    martinqian
        5
    martinqian  
       2019 年 6 月 13 日
    import 只是从 GOROOT 对应环境下导入指定的包,如果没找到,会报错而不是尝试去下载。

    下载包使用的是 go get 命令,如果想更新,则可以使用 go get -u。
    clino
        6
    clino  
       2019 年 6 月 13 日 via Android
    能指定 branch 或者 tag 吗?
    Muninn
        7
    Muninn  
       2019 年 6 月 13 日
    go mod 不能锁定小版本,只会锁定大版本。

    但是 golang 建议小版本不能改 API,事实上知名的包也确实没人改。

    所以不用太害怕这个问题了。
    gramyang
        8
    gramyang  
    OP
       2019 年 6 月 13 日
    @Muninn 明显不对好吧,你的依赖代码不能指定版本,那你的工程随时会崩溃,这怎么可能是小问题呢,必须上 go mod 啊
    martinqian
        9
    martinqian  
       2019 年 6 月 13 日
    go get github.com/[email protected]

    go mod edit -require github.com/[email protected]

    如上面各位 V 友所说,推荐使用 go mod,这个是从 1.11 版本开始支持的,在基于项目的包管理上提供了方便。
    zealic
        10
    zealic  
       2019 年 6 月 13 日
    go mod + vendor 模式就行

    ```
    go mod vendor
    go build -mod=vendor
    ```

    产生的 vendor 文件夹加入代码仓库即可。
    Hellert
        11
    Hellert  
       2019 年 6 月 13 日   1
    import 语句后面的 github 字符串不能理解为网址,而是 GOPATH 里面的包路径。
    Baldwin
        12
    Baldwin  
       2019 年 6 月 13 日
    可以 fork 到自建仓库,有需要的时候在更新
    littlemoney
        13
    littlemoney  
       2019 年 6 月 13 日
    问下各位大佬,有在公司项目中使用 go mod 的吗
    thet
        14
    thet  
       2019 年 6 月 13 日 via Android
    go 2 好像有 mirror,包会更集中吧,现在觉得 vendor+go mod 比较好用
    ChristopherWu
        15
    ChristopherWu  
       2019 年 6 月 13 日
    @Hellert 其实这样理解也没有问题,要先到此 url 下载包,放到 GOPATH 此路径中,再引用- -
    shilyx
        16
    shilyx  
       2019 年 6 月 13 日
    go mod 虽然好用,但我的 idea 的 golang 插件不支持自动跳转了

    遗憾的滚回到 go get 上
    gy0624ww
        17
    gy0624ww  
       2019 年 6 月 13 日
    赶紧 golang 的包管理很乱啊
    之前用 glide,然后说不维护了,官方出了 dep,
    现在又出来个这个 go mod.
    这个 dep 和 go mod, 哪个好啊。

    咋就没个统一的解决方案呢 ,选择困难症啊
    Hellert
        18
    Hellert  
       2019 年 6 月 13 日
    @gy0624ww 以后就是 gomod 了,这是官方的,统一了。年内发布的 golang 1.13 版本开始就是废弃 GOPATH,默认 gomod 了。
    gy0624ww
        19
    gy0624ww  
       2019 年 6 月 13 日
    @Hellert dep 不也是官方出的吗。。这么快就不用了?
    Hellert
        20
    Hellert  
       2019 年 6 月 13 日
    @ChristopherWu 嗯嗯,gomod 模式下,import 可以理解为远程路径,因为会根据这个路径去自动下载;但在 GOPATH 模式下设计初衷就是本地路径。
    shawndev
        21
    shawndev  
       2019 年 6 月 13 日
    go mod + goproxy
    lhx2008
        22
    lhx2008  
       2019 年 6 月 13 日 via Android
    @Hellert
    @zealic
    gomod 如果本地有一个工具包要怎么搞,先发版到私有仓库吗,怎么解决耦合问题
    randm
        23
    randm  
       2019 年 6 月 13 日
    体验过 go mod 后又回到 GOPATH 主要方便
    Hellert
        24
    Hellert  
       2019 年 6 月 13 日   1
    @lhx2008 go.mod 文件中用 replace 指令
    blless
        25
    blless  
       2019 年 6 月 13 日 via Android
    goproxy.cn 速度更快一点
    abmin521
        26
    abmin521  
       2019 年 6 月 13 日 via Android
    至今没解决两个包依赖一个库的不同版本 那能怎么办 fork 呗
    还有似乎不能清理?
    chennqqi
        27
    chennqqi  
       2019 年 6 月 13 日
    @Hellert +1 gopath 简单 go get 通用
    Muninn
        28
    Muninn  
       2019 年 6 月 13 日
    @gramyang 不好意思,我说的不太对。 用了 go module 后,在最后一次 go test 或者 go build 自动补完 go.mod 文件后提交,是会锁定所有版本的。

    我当时是想说我没事干就 go get -u,也并没有崩过,这是因为 go mod 的依赖版本冲突后版本选择大的那个版本导致的,知名的库一般都会比较注意,都是向前兼容的。
    fengyj
        29
    fengyj  
       2019 年 6 月 13 日
    现在都使用 go mod 搭配 GOPROXY=https://goproxy.io
    aimerforreimu
        30
    aimerforreimu  
       2019 年 6 月 17 日
    https://go.likeli.top 这个速度也很快~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     999 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 23:33 PVG 07:33 LAX 15:33 JFK 18:33
    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