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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式