一架梯子,一头程序猿,仰望星空!

go语言包管理


实际项目总要依赖各种第三发开发包,各类开发语言都有自己的第三方包依赖管理工具,例如:java的maven、js的npm、php的composer等,golang在1.11版本以前官方是没有提供包依赖管理工具的,只有一些社区提供的工具,从1.11版本以后官方就提供mod模块管理工具。

下面介绍如何使用go mod管理第三方依赖包

1.升级go语言版本

目前最新的go语言版本是1.16, 如果你是最新的版本可以不用重新安装。

提示:如果你的go版本是1.11-1.13这些老版本,需要通过下面配置开启模块管理功能,新版本可以直接跳过这个章节。

通过环境变量GO111MODULE设置是否开启模块管理,GO111MODULE有三种值:

  • off - 关闭module功能
  • on - 打开module功能
  • auto - 如果项目在GOPATH路径下面,不使用module功能,如果项目在GOPATH路径之外,则开启module功能。

linux/macos设置环境变量:

修改~/.bash_profile或者~/.bashrc文件,添加下面配置

export GO111MODULE=on

使用module模块管理功能,我们就可以把项目放在任何目录。

2.初始化模块

切换到项目根目录,执行下面命令。

命令说明:

go mod init 项目名

项目名,建议使用域名作为前缀,例如: tizi365.com/blog

说明:使用域名作为包前缀可以确保全球唯一,如果你开发的包需要开源给其他人使用,可以避免冲突。

例子:

// 创建项目目录
mkdir blog
// 切换到blog
cd blog
// 初始化模块
go mod init tizi365.com/blog

初始化模块后,会在当前目录生成一个go.mod文件,这个文件记录了当前项目依赖的第三方包。

go.mod文件内容如下,目前因为还没安装依赖包,所以没有依赖包信息。

module tizi365.com/blog
  
go 1.16

提示:go.mod文件需要提交到git仓库中,方便其他开发自动安装依赖包。

3.自动分析源码,安装依赖包

经过上面步骤初始化之后,执行下面命令,会自动分析源码中的依赖包,安装缺少的依赖包。

例子:

// 自动分析源码中的依赖,安装依赖包
go mod tidy

// 在项目根目录安装依赖包,会自动将依赖信息写入go.mod
go get github.com/jinzhu/gorm

// 运行程序
go run main.go

// 构建项目
go build

当执行上面任何命令之后,如果你打开go.mod文件,会发现多了一些依赖包的信息。

例子:

文件名:main.go

package main

import (
    "net/http"
    
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}

运行程序

// 自动分析源码中的依赖,安装依赖包
go mod tidy
// 执行
go run main.go

打开go.mod文件,内容类似下面:

module tizi365.com/blog
  
go 1.16

require (
        github.com/labstack/echo v3.3.10+incompatible // indirect
        github.com/labstack/gommon v0.3.0 // indirect
        golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc // indirect
)

4.手动安装依赖包

只要在项目目录,执行go get命令安装第三方包,会自动更新go.mod文件,将依赖信息添加进去,因此我们只要将go.mod提交到代码仓库中,其他开发者只要更新代码,运行程序,就会自动下载缺少的依赖包。

5.vendor目录

默认情况下,Go语言安装的第三方依赖包,是安装在GOPATH/src目录下面,不是安装在项目目录中,go编译器也会到GOPATH目录中查找安装包。

go语言也支持将第三方依赖包安装到项目目录中,这个目录就是vendor,如果项目的根目录下面存在vendor目录,编译器优先到vendor目录中查找依赖包。

下面是go module的命令,可以一键创建vendor目录,将依赖包复制进去。

// 在项目根目录执行
go mod vendor

命令执行成功后,项目根目录多了一个vendor目录,里面包含我们项目依赖的所有第三方包。