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

2019-06-13 07:44:54 +08:00
 gramyang

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

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

4511 次点击
所在节点    Go 编程语言
30 条回复
Cbdy
2019-06-13 07:46:22 +08:00
使用 go mod
acehow
2019-06-13 08:17:58 +08:00
不是实时的吧,要先用 go get 命令拉下来的。包管理的话,可以有 go mod init 生成一个文件,里面会有依赖的包版本,但也要看 github 上标签的质量。
xiri
2019-06-13 08:20:33 +08:00
现在可以用 go mod,默认会记录版本号
mritd
2019-06-13 08:29:36 +08:00
martinqian
2019-06-13 08:51:08 +08:00
import 只是从 GOROOT 对应环境下导入指定的包,如果没找到,会报错而不是尝试去下载。

下载包使用的是 go get 命令,如果想更新,则可以使用 go get -u。
clino
2019-06-13 08:52:58 +08:00
能指定 branch 或者 tag 吗?
Muninn
2019-06-13 08:55:34 +08:00
go mod 不能锁定小版本,只会锁定大版本。

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

所以不用太害怕这个问题了。
gramyang
2019-06-13 09:02:27 +08:00
@Muninn 明显不对好吧,你的依赖代码不能指定版本,那你的工程随时会崩溃,这怎么可能是小问题呢,必须上 go mod 啊
martinqian
2019-06-13 09:22:01 +08:00
go get github.com/repo@0.0.1

go mod edit -require github.com/repo@0.0.1

如上面各位 V 友所说,推荐使用 go mod,这个是从 1.11 版本开始支持的,在基于项目的包管理上提供了方便。
zealic
2019-06-13 09:26:07 +08:00
go mod + vendor 模式就行

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

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

遗憾的滚回到 go get 上
gy0624ww
2019-06-13 11:48:36 +08:00
赶紧 golang 的包管理很乱啊
之前用 glide,然后说不维护了,官方出了 dep,
现在又出来个这个 go mod.
这个 dep 和 go mod, 哪个好啊。

咋就没个统一的解决方案呢 ,选择困难症啊
Hellert
2019-06-13 11:52:40 +08:00
@gy0624ww 以后就是 gomod 了,这是官方的,统一了。年内发布的 golang 1.13 版本开始就是废弃 GOPATH,默认 gomod 了。
gy0624ww
2019-06-13 11:53:54 +08:00
@Hellert dep 不也是官方出的吗。。这么快就不用了?
Hellert
2019-06-13 12:01:08 +08:00
@ChristopherWu 嗯嗯,gomod 模式下,import 可以理解为远程路径,因为会根据这个路径去自动下载;但在 GOPATH 模式下设计初衷就是本地路径。

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

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

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

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

© 2021 V2EX