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

发布于 1周前 作者 phonegap100 来自 Go语言

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

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

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

go mod vendor

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

23 回复

手动 git 下来放项目里,然后再绝对路径引用,就跟项目里的模块引用一样
Module 管理不香嘛,还可以管理版本
你这样的需求真是别致…

更多关于Golang Go语言中的包管理一定要下载到 GOPATH 中再导入到 Vendor 目录吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这年头就不要用 vendor 了,全用 go.mod 就行了,项目里不用放依赖的东西。
怕网络问题的设置一下 goproxy 就好了。

直接用 go.mod 就好了呀。

vendor 是上古的临时解决方案,目前已被弃置,有难以更新依赖等问题,不建议使用。

搜索的时候可以加上 past year

go.mod 里可以通过 replace 指定包的路径

在代码里面 import pkg 就好了,然后 gomod init gomod tidy 就自动填充 go.mod 内容并下载依赖到$GOPATH/pkg/mod 里面。

也可以手动 goget 添加库或者编辑 go.mod 文件。

我们项目目前仍然使用 vendor 并且提交到代码库
和同事讨论过,主要两个原因:
- 正如上面说的,怕有难下载的库.可能现在有 goproxy 了好了很多,早期一些 google/x/目录的库都已经迁移或者废弃,很折腾人.
- CI/CD 编译不需要每次全量 download 依赖

感觉这个问题都可以通过将这些依赖同步到私有 git 解决吧

应该是不行的
可以通过架设私有 proxy 解决

#9
现在几乎没有下不到库的问题了 现在基本在 goproxy 都能找到

所以…有人愿意写个过程吗?
从创建一个项目开始…
go mod init
然后呢?
下载依赖库的姿势呢?就是 go get 吗?
接下来?

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

不要说什么 vendor 是“上古临时方案”这种话了。用了开源库,项目稳定了之后,如果不 vendor ,要是源库删除了之后,你就知道抓狂了。整个项目都运行不了。你不能保证引用的库不会被删。

我只是单纯的想把所有依赖都放到项目目录中…这样做让我舒服…

买个 clash 机场代理吧 ,google 都访问不了 。开发什么

go mod vendor 挺好的啊,你开发完了,执行一下,依赖库就直接打包到 vendor 目录下了,可以带着到处走,想编译的时候就编译,也不用联网
用法就是 go mod init xxx ,然后 go get yyyyy ,然后 go mod vendor
以后想更新依赖就再 go get ,然后再 go mod vendor

话说…Clash 我一直不知道怎么添加 Vmess 协议的服务器…

Clash 只支持订阅模式吗?

上面的人都不懂 go mod vendor 的价值,就来个 go mod vendor 上古了。 “own your dependencies” “无网络开发”

涉密单位吗? 无网络开发…

地铁上不能开发吗?飞机上要改点东西呢? 即使不是涉密单位,就不能在意隐私吗?

针对帖子中提到的Golang Go语言中的包管理问题,以下是我的专业回复:

在Go语言中,包管理并不一定要将包下载到GOPATH中再导入到Vendor目录。Go 1.11版本引入了Go Modules,这是一种新的包管理方式,它使得项目不必放在GOPATH/src内,可以放在任意位置。

使用Go Modules时,只需在项目根目录下执行go mod init命令初始化模块,然后使用go get命令下载和安装包。下载的包和版本信息会自动记录在go.mod文件中,而实际的包文件可以保存在项目目录下的任意位置(通常不会直接放在GOPATH中)。

此外,Go Modules还支持将第三方依赖包放在Vendor目录中。这可以通过执行go mod vendor命令实现,该命令会将mod依赖的第三方库下载并生成到Vendor目录下。这样,当mod依赖的项目在Vendor中能直接找到时,就不会使用mod远程下载到本地并引用。

因此,Go语言的包管理并不依赖于GOPATH,而是可以通过Go Modules实现更灵活和高效的包管理。在实际开发中,建议优先使用Go Modules进行包管理。

回到顶部