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

go mod vendor 正确使用姿势?

  •  
  •   douz · 2 天前 · 1153 次点击

    要下班了,摸一会儿鱼。

    想到一个问题就是如果把 vendor 目录纳入 git 管理,但是如果在 windows 下和 linux 下同时进行开发,用的 go sdk 都是不一样的,go mod vendor 好像就有问题。

    1. 需要把 vendor 目录纳入 git 管理么?
    2. 一般什么情况下使用 vendor?
    20 条回复    2025-03-06 13:56:41 +08:00
    mooyo
        1
    mooyo  
       2 天前   ❤️ 1
    五年前就不用 vendor 了吧,老项目吗?
    Cannian
        2
    Cannian  
       2 天前   ❤️ 1
    现在都用 mod 了,老项目才用 vendor
    Nazz
        3
    Nazz  
       2 天前   ❤️ 1
    我现在用 go mod tidy 了, 以前喜欢 vendor
    douz
        4
    douz  
    OP
       2 天前
    @Cannian 如果是容器环境,直接设置一下 go proxy, 然后 go mod download 就行了么?
    lasuar
        5
    lasuar  
       2 天前   ❤️ 1
    只有当你用到了那种私有库、临时库,担心引用的库未来可能消失 的时候才会用 vendor 。不过开发时也不好用,比如下载了新库时,直接在 IDE 中输入是不能自动识别的(纯 mod 模式就可以)。现在我都不用 vendor 了,如果有那种比较重要的库,干脆直接 down 下来放本地的 internal pkg 。
    Cheivin
        6
    Cheivin  
       2 天前   ❤️ 1
    如果你用私有库还要把代码跟项目 git 一起,用 go mod 然后 repace 路径吧
    Cheivin
        7
    Cheivin  
       2 天前
    @Cheivin #6 打错了,是 replace
    Trim21
        8
    Trim21  
       2 天前   ❤️ 1
    > 但是如果在 windows 下和 linux 下同时进行开发,用的 go sdk 都是不一样的,go mod vendor 好像就有问题

    会有啥问题? go mod vendor 会选择只 vendor _linux 文件或者 _windows 文件然后忽略另一个吗?
    icy37785
        9
    icy37785  
       2 天前 via iPhone   ❤️ 1
    vendor 是坏文明,vendor 的正确使用姿势就是不用。
    sardina
        10
    sardina  
       2 天前   ❤️ 1
    https://github.com/goproxy/goproxy 内网搭建一个 goproxy
    stormtrooperx5
        11
    stormtrooperx5  
       2 天前   ❤️ 1
    咋这么多人不用 vendor ?镜像打包速度快很多啊
    iyaozhen
        12
    iyaozhen  
       2 天前   ❤️ 1
    99%场景不需要 go mod vendor

    现在唯一用 vendor 的地方,是要打 go 插件,而且也不把 vendor 提交到 git ,而是 CI 环境固定 go 版本(宿主要和插件一模一样版本号),执行 go mod vendor 后再 build
    HappyAndSmile
        13
    HappyAndSmile  
       1 天前
    @stormtrooperx5 自己搭一个 go mod proxy ,为什么会需要 vendor ?为什么会慢?
    Cannian
        14
    Cannian  
       1 天前   ❤️ 1
    @douz 你可以网上找找别人的 dockerfile 文件,你这样是可以的。一般还有两阶段构建之类的操作减少镜像体积,不在意也可以不用管
    arcfya
        15
    arcfya  
       1 天前   ❤️ 1
    除非特殊环境一定不允许开 go mod proxy (比如各种政府国企单位),不然不推荐使用 vendor 。

    vendor 在不同 go sdk 下确实可能有问题,比如 go 的那几个 crypto 库,我就遇到过 sdk 不兼容的问题
    stormtrooperx5
        16
    stormtrooperx5  
       1 天前
    @HappyAndSmile 依赖库多了再怎么自建 proxy 也比不上直接读本地快
    zgh123
        17
    zgh123  
       1 天前
    如果旧项目采用的 vendor ,如何升级把 vendor 目录从 git 中去除呢?
    lasuar
        18
    lasuar  
       1 天前
    @zgh123 #17 你这个问题直接 kimi 可以解决,我就不贴答案了。问题是“采用 vendor 模式的 go 项目中,如何升级把 vendor 目录从 git 中去除。注意,vendor 内可能有已经失效的远程库,此时如何区分”。

    解决的关键是在本地新建 xvendor 目录存放失效的远程库,然后在 go.mod 文件中使用 replace 语法帮助 go 定位这些库。
    to2false
        19
    to2false  
       15 小时 29 分钟前
    vendor 放进 git ,我就有个问题,是不考虑 code review 吗
    stormtrooperx5
        20
    stormtrooperx5  
       10 小时 35 分钟前
    @to2false 自动排除 vendor 目录,这不就一行脚本的事
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1772 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 16:31 · PVG 00:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.