本文将对go mod 和 go work两个依赖管理工具进行简单的说明。未能解释清楚的地方可用自行查阅官方文档。
module
go module是 Go1.11 版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go module成为了 Go 语言默认的依赖管理工具。
重要环境变量
GO111MODULE
GO111MODULE是用于控制go module工作模式的环境变量,它有三个可选值:
off禁用,编译时从GOPATH和vendor中查找依赖包。on启用,编译时只更具go.mod管理依赖。auto自动,当项目不在$GOPATH/src下,并且项目根目录有go.mod文件时,开启模块支持。
GOPROXY
GOPROXY用于配置下载依赖的代理地址,默认值为https://proxy.golang.org,但对于国内用户不是很友好。
可以使用其他镜像源替代,如goproxy.cn
go env -w GOPROXY=https://goproxy.cn,direct |
此外还有
https://mirrors.aliyun.com/goproxy |
go mod常用命令
go mod init xxx初始化当前文件夹, 创建 go.mod 文件 xxx 为希望的 module 名go mod tidy增加缺少的 module,删除无用的 modulego mod vendor将依赖复制到 vendor 下- 其他命令看使用
go mod help自行查看
go.mod文件
例子
module github.com/Q1mi/studygo/blogger |
- module 用于定义包名,或者叫模块名
- require 用于指定依赖包
- replace 用于重定向,如示例中重定向到本地。一般用于解决外网访问问题。
- indirect 表示间接引用
go get命令
在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。
go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z 是修订版本号, y 是次要版本号)go get -u=patch将会升级到最新的修订版本go get package@version将会升级到指定的版本号 version
如果下载所有依赖可以使用go mod download命令。
其他操作
- 格式化
go.mod文件
在手动修改go.mod文件后,使用go mod edit -fmt格式化go.mod文件 - 命令行重定向包
go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest - 清理
module缓存go clean -modcache - 查看可下载的包版本
go list -m -versions xxx - 使用最新包 慎用
require ( |
Workspaces
在go 1.18后,使用 workspaces 支持开发者同时在多个 module 中间进行编码(不需要修改 go.mod 文件),可以方便的进行编译运行等工作。常用于common组件开发,如日志库、错误库等等。
常用命令
go work或go help work
查看帮助文档。go work init
初始化 workspaces 文件,创建一个go.work文件,并将添加指定文件夹中的 module。go work init .\hellogo work use
添加新的 module 到go.work文件中。go work use .\example
实际操作
创建
workspace工作目录$ mkdir workspace
$ cd workspace创建
hellomodule$ mkdir hello
$ cd hello
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello在
hello文件夹下添加hello.gopackage main
import (
"fmt"
)
func main() {
fmt.Println("hello")
}回到
workspce目录下,执行$ go work init ./hello
产生一个
go.work文件,内容如下。go 1.18
use ./hello添加依赖
example- 在 workspace 目录下创建 example 文件夹,并初始化 go mod实际开发中这里的 go mod 应该指向代码仓库,如
mkdir example
cd example
go mod init examplegithub.com/xxx/xxx
- 在 workspace 目录下创建 example 文件夹,并初始化 go mod
添加新
moduel
回到 workspace 目录执行go work use ./example
此时,
go.work文件会增加example相关信息。go 1.18
use (
./example
./hello
)
修改本地代码进行测试
在workspace/example/目录下创建一个新文件stringutil/test.gopackage stringutil
func DoSomething(s string) string {
return "prfix " + s
}修改
workspace/hello/hello.go代码如下:package main
import (
"fmt"
"example/stringutil"
)
func main() {
fmt.Println(stringutil.ToUpper("hello"))
}运行测试
$ go run example.com/hello
HELLO最终的文件结构如下:
│ go.work
│
├─example
│ │ go.mod
│ │
│ └─stringutil
│ test.go
│
└─hello
go.mod
go.sum
main.go我们开发 example 中的公共代码,并在 hello 中进行测试。
参考资料
- 本文作者: Tiny Beer
- 本文链接: https://tinybeer.github.io/2024/05/30/Go依赖管理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
