golang 依赖包的版本管理

更新日期: 2019-10-15 阅读次数: 8222 字数: 495 分类: golang

现实需求场景

我的一个新项目要基于 golang gin web 框架。我可能会在多台开发机上同时进行开发,所以就涉及到 golang 项目的开发环境同步问题。 而目前我只会 go get 进行依赖安装,目前只有一个 gin 依赖包还好;但是如果依赖包多了,那岂不是要麻烦死。

golang 是否有像 php composer 和 python pip 这样的包管理功能。

go modules

找了一圈感觉 go 1.11 引入的 modules 满足我的需求。比之前版本的 go dep 方案好太多了。

go dep 不方便的地方

新项目在自己工作目录下,使用 dep 初始化会报错:

$ dep init

init failed: unable to detect the containing GOPATH: /home/zhongwei/work/my_project/go is not within a known GOPATH/src

而我并不希望将新项目的目录 my_project/go 加入到 GOPATH 中。

go modules 的使用方法

初始化:

> go mod init sunzhongwei.com/go
go: creating new go.mod: module sunzhongwei.com/go_tool

> ls
go.mod

> cat go.mod
module sunzhongwei.com/go_tool

go 1.13

新建一个 gin main 文件 main.go

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080
}

执行 go build, 会看到目录下多了两个文件 go.sum 和 go_tool

> ls
go.mod  go.sum  go_tool*  main.go

go.mod 随之更新

> cat go.mod
module sunzhongwei.com/go_tool

go 1.13

require github.com/gin-gonic/gin v1.4.0

go.mod 的作用是什么

从上面的步骤来看,go build 可以自动下载依赖,那还要 go.mod 有什么用?

我觉得类似 composer install 一样,也是第一次更新 go.mod 文件,添加没有的依赖。

之后就会读取 go.mod。

go module 与 package 的区别

A module is a collection of related Go packages that are versioned together as a single unit.

即,module 包含了一堆 packages。版本号是打在 module 上,而不是 package 上。

go.sum 的作用

用来校验下载的依赖包的 hash 值。

参考

  • https://blog.golang.org/using-go-modules
  • https://github.com/golang/go/wiki/Modules

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式