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

2021-11-28 22:24:14 +08:00
 jeeyong

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

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

go mod vendor

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

3005 次点击
所在节点    Go 编程语言
22 条回复
Zhouisme
2021-11-28 22:36:06 +08:00
手动 git 下来放项目里,然后再绝对路径引用,就跟项目里的模块引用一样
Module 管理不香嘛,还可以管理版本
你这样的需求真是别致...
jim9606
2021-11-28 23:58:51 +08:00
这年头就不要用 vendor 了,全用 go.mod 就行了,项目里不用放依赖的东西。
怕网络问题的设置一下 goproxy 就好了。
icy37785
2021-11-29 00:03:07 +08:00
直接用 go.mod 就好了呀。
timpaik
2021-11-29 00:03:23 +08:00
vendor 是上古的临时解决方案,目前已被弃置,有难以更新依赖等问题,不建议使用。
darksword21
2021-11-29 01:22:07 +08:00
搜索的时候可以加上 past year
missdeer
2021-11-29 09:24:42 +08:00
go.mod 里可以通过 replace 指定包的路径
eudore
2021-11-29 09:37:52 +08:00
在代码里面 import pkg 就好了,然后 gomod init gomod tidy 就自动填充 go.mod 内容并下载依赖到$GOPATH/pkg/mod 里面。

也可以手动 goget 添加库或者编辑 go.mod 文件。
Immortal
2021-11-29 09:46:37 +08:00
我们项目目前仍然使用 vendor 并且提交到代码库
和同事讨论过,主要两个原因:
- 正如上面说的,怕有难下载的库.可能现在有 goproxy 了好了很多,早期一些 google/x/目录的库都已经迁移或者废弃,很折腾人.
- CI/CD 编译不需要每次全量 download 依赖
ruanimal
2021-11-29 10:25:50 +08:00
@Immortal 感觉这个问题都可以通过将这些依赖同步到私有 git 解决吧
masterclock
2021-11-29 11:22:00 +08:00
@ruanimal 应该是不行的
可以通过架设私有 proxy 解决
Immortal
2021-11-29 13:45:06 +08:00
@ruanimal #9
现在几乎没有下不到库的问题了 现在基本在 goproxy 都能找到
jeeyong
2021-11-29 16:39:57 +08:00
所以..有人愿意写个过程吗?
从创建一个项目开始..
go mod init
然后呢?
下载依赖库的姿势呢?就是 go get 吗?
接下来?
cloudfstrife
2021-11-30 10:22:50 +08:00
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
2021-11-30 13:22:01 +08:00
不要说什么 vendor 是“上古临时方案”这种话了。用了开源库,项目稳定了之后,如果不 vendor ,要是源库删除了之后,你就知道抓狂了。整个项目都运行不了。你不能保证引用的库不会被删。
jeeyong
2021-12-01 00:55:44 +08:00
@cloudfstrife 我只是单纯的想把所有依赖都放到项目目录中...这样做让我舒服...
liaohongxing
2021-12-01 17:27:31 +08:00
买个 clash 机场代理吧 ,google 都访问不了 。开发什么
Kisesy
2021-12-01 23:02:51 +08:00
go mod vendor 挺好的啊,你开发完了,执行一下,依赖库就直接打包到 vendor 目录下了,可以带着到处走,想编译的时候就编译,也不用联网
用法就是 go mod init xxx ,然后 go get yyyyy ,然后 go mod vendor
以后想更新依赖就再 go get ,然后再 go mod vendor
jeeyong
2021-12-02 10:10:24 +08:00
@liaohongxing 话说...Clash 我一直不知道怎么添加 Vmess 协议的服务器..
jeeyong
2021-12-02 10:10:37 +08:00
@liaohongxing Clash 只支持订阅模式吗?
XTTX
2021-12-07 16:22:01 +08:00
@Kisesy 上面的人都不懂 go mod vendor 的价值,就来个 go mod vendor 上古了。 "own your dependencies" "无网络开发"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX