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

Golang 的包管理一定要下下载到 GOPATH 中, 再导入到 Vendor 目录吗?

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

    Golang 包管理的疑问. 目前的创建项目的顺序是: go mod init

    把可能需要的包都 go get 下载. 编写主文件. go mod tidy

    go mod vendor

    请教, 应该是什么样的姿势? 我希望是直接把项目依赖安装到项目目录中... 比如 npm i xxx 或者像 python 那样有个虚拟环境?

    22 条回复    2021-12-11 11:22:08 +08:00
    Zhouisme
        1
    Zhouisme  
       51 天前 via Android
    手动 git 下来放项目里,然后再绝对路径引用,就跟项目里的模块引用一样
    Module 管理不香嘛,还可以管理版本
    你这样的需求真是别致...
    jim9606
        2
    jim9606  
       51 天前
    这年头就不要用 vendor 了,全用 go.mod 就行了,项目里不用放依赖的东西。
    怕网络问题的设置一下 goproxy 就好了。
    icy37785
        3
    icy37785  
       51 天前 via iPhone
    直接用 go.mod 就好了呀。
    timpaik
        4
    timpaik  
       51 天前 via Android
    vendor 是上古的临时解决方案,目前已被弃置,有难以更新依赖等问题,不建议使用。
    darksword21
        5
    darksword21  
       51 天前 via iPhone
    搜索的时候可以加上 past year
    missdeer
        6
    missdeer  
       51 天前
    go.mod 里可以通过 replace 指定包的路径
    eudore
        7
    eudore  
       51 天前
    在代码里面 import pkg 就好了,然后 gomod init gomod tidy 就自动填充 go.mod 内容并下载依赖到$GOPATH/pkg/mod 里面。

    也可以手动 goget 添加库或者编辑 go.mod 文件。
    Immortal
        8
    Immortal  
       51 天前
    我们项目目前仍然使用 vendor 并且提交到代码库
    和同事讨论过,主要两个原因:
    - 正如上面说的,怕有难下载的库.可能现在有 goproxy 了好了很多,早期一些 google/x/目录的库都已经迁移或者废弃,很折腾人.
    - CI/CD 编译不需要每次全量 download 依赖
    ruanimal
        9
    ruanimal  
       51 天前
    @Immortal 感觉这个问题都可以通过将这些依赖同步到私有 git 解决吧
    masterclock
        10
    masterclock  
       51 天前
    @ruanimal 应该是不行的
    可以通过架设私有 proxy 解决
    Immortal
        11
    Immortal  
       50 天前
    @ruanimal #9
    现在几乎没有下不到库的问题了 现在基本在 goproxy 都能找到
    jeeyong
        12
    jeeyong  
    OP
       50 天前
    所以..有人愿意写个过程吗?
    从创建一个项目开始..
    go mod init
    然后呢?
    下载依赖库的姿势呢?就是 go get 吗?
    接下来?
    cloudfstrife
        13
    cloudfstrife  
       50 天前   ❤️ 1
    go mod vendor 只用于一种情况,那就是:你的代码要在一个不能访问外网的环境下编译的时候,可以在外网 go mod vendro 然后打包,拷贝到内网编译。

    一般可以访问外部网络的环境,我的过程是:
    go mod init xxxx.xxx/xxx/xxx
    touch main.go
    实现功能,过程中如果要增加新的依赖,可以用 go get xxxx.xxxx/xxxx/xxx
    写完用 go mod tidy 自动更新 go.mod
    go build

    一般会写 Makefile ,我有一个仓库,用写了一些常用的 make 指令 ,用于构建 Go 项目:
    https://github.com/cloudfstrife/gomake
    skiy
        14
    skiy  
       49 天前
    不要说什么 vendor 是“上古临时方案”这种话了。用了开源库,项目稳定了之后,如果不 vendor ,要是源库删除了之后,你就知道抓狂了。整个项目都运行不了。你不能保证引用的库不会被删。
    jeeyong
        15
    jeeyong  
    OP
       49 天前
    @cloudfstrife 我只是单纯的想把所有依赖都放到项目目录中...这样做让我舒服...
    liaohongxing
        16
    liaohongxing  
       48 天前
    买个 clash 机场代理吧 ,google 都访问不了 。开发什么
    Kisesy
        17
    Kisesy  
       48 天前   ❤️ 1
    go mod vendor 挺好的啊,你开发完了,执行一下,依赖库就直接打包到 vendor 目录下了,可以带着到处走,想编译的时候就编译,也不用联网
    用法就是 go mod init xxx ,然后 go get yyyyy ,然后 go mod vendor
    以后想更新依赖就再 go get ,然后再 go mod vendor
    jeeyong
        18
    jeeyong  
    OP
       48 天前
    @liaohongxing 话说...Clash 我一直不知道怎么添加 Vmess 协议的服务器..
    jeeyong
        19
    jeeyong  
    OP
       48 天前
    @liaohongxing Clash 只支持订阅模式吗?
    XTTX
        20
    XTTX  
       42 天前
    @Kisesy 上面的人都不懂 go mod vendor 的价值,就来个 go mod vendor 上古了。 "own your dependencies" "无网络开发"
    jeeyong
        21
    jeeyong  
    OP
       42 天前
    @XTTX 涉密单位吗? 无网络开发...
    XTTX
        22
    XTTX  
       39 天前
    @jeeyong 地铁上不能开发吗?飞机上要改点东西呢? 即使不是涉密单位,就不能在意隐私吗?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3270 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:17 · PVG 12:17 · LAX 20:17 · JFK 23:17
    ♥ Do have faith in what you're doing.