不懂就问,关于 Golang Go语言的包管理
不懂就问,关于 Golang Go语言的包管理
Go 官方推荐,很多人也爱这么写,就是在 import 时直接写 github 地址。不同于 Java 里面下载 jar 包,而是实时从 github 上下载代码。
问题来了,如果 github 上的代码被修改,或者更新了,导致功能变更或者代码结构变更怎么办? go 可以像 Java 一样导入某一个版本的代码吗?
不是实时的吧,要先用 go get 命令拉下来的。包管理的话,可以有 go mod init 生成一个文件,里面会有依赖的包版本,但也要看 github 上标签的质量。
现在可以用 go mod,默认会记录版本号
go mod +1 https://goproxy.io
import 只是从 GOROOT 对应环境下导入指定的包,如果没找到,会报错而不是尝试去下载。
下载包使用的是 go get 命令,如果想更新,则可以使用 go get -u。
能指定 branch 或者 tag 吗?
go mod 不能锁定小版本,只会锁定大版本。
但是 golang 建议小版本不能改 API,事实上知名的包也确实没人改。
所以不用太害怕这个问题了。
明显不对好吧,你的依赖代码不能指定版本,那你的工程随时会崩溃,这怎么可能是小问题呢,必须上 go mod 啊
go mod + vendor 模式就行<br>go mod vendor<br>go build -mod=vendor<br>
产生的 vendor 文件夹加入代码仓库即可。
import 语句后面的 github 字符串不能理解为网址,而是 GOPATH 里面的包路径。
可以 fork 到自建仓库,有需要的时候在更新
问下各位大佬,有在公司项目中使用 go mod 的吗
其实这样理解也没有问题,要先到此 url 下载包,放到 GOPATH 此路径中,再引用- -
go mod 虽然好用,但我的 idea 的 golang 插件不支持自动跳转了
遗憾的滚回到 go get 上
赶紧 golang 的包管理很乱啊
之前用 glide,然后说不维护了,官方出了 dep,
现在又出来个这个 go mod.
这个 dep 和 go mod, 哪个好啊。
咋就没个统一的解决方案呢 ,选择困难症啊
以后就是 gomod 了,这是官方的,统一了。年内发布的 golang 1.13 版本开始就是废弃 GOPATH,默认 gomod 了。
dep 不也是官方出的吗。。这么快就不用了?
嗯嗯,gomod 模式下,import 可以理解为远程路径,因为会根据这个路径去自动下载;但在 GOPATH 模式下设计初衷就是本地路径。
go mod + goproxy
gomod 如果本地有一个工具包要怎么搞,先发版到私有仓库吗,怎么解决耦合问题
体验过 go mod 后又回到 GOPATH 主要方便
go.mod 文件中用 replace 指令
goproxy.cn 速度更快一点
至今没解决两个包依赖一个库的不同版本 那能怎么办 fork 呗
还有似乎不能清理?
+1 gopath 简单 go get 通用
不好意思,我说的不太对。 用了 go module 后,在最后一次 go test 或者 go build 自动补完 go.mod 文件后提交,是会锁定所有版本的。
我当时是想说我没事干就 go get -u,也并没有崩过,这是因为 go mod 的依赖版本冲突后版本选择大的那个版本导致的,知名的库一般都会比较注意,都是向前兼容的。
现在都使用 go mod 搭配 GOPROXY=https://goproxy.io
关于Golang的包管理,这是一个非常重要且实用的技能。在Go语言中,包(package)是函数和数据的集合,用于组织代码,实现模块化开发。
在Go 1.11版本之前,Go代码必须放在GOPATH下,GOPATH是Go语言的工作区,用于存放Go代码、依赖包和编译生成的文件。但自Go 1.11版本起,引入了Go Modules,它使得项目不必再放在GOPATH/src内,可以放在任意位置。使用Go Modules进行包管理时,你需要在项目根目录下执行go mod init [module name]
来初始化模块,并生成一个go.mod文件。之后,使用go get [package path]
命令添加依赖包,Go Modules会自动更新go.mod文件。
此外,虽然dep是另一种Golang的包管理工具,但Go Modules是官方推荐使用的,因此建议优先使用Go Modules。
在进行包管理时,还需注意一些最佳实践,如使用合理的包结构、隐藏实现细节只提供必要的接口、定期清理无用的依赖等。这些实践有助于提高代码的可读性、可维护性和项目的整体质量。
希望这些信息能帮助你更好地理解Golang的包管理。如果你还有其他问题,欢迎随时提问。