Skip to main content

Golang 模块

caution
  • 不支持 Git 子目录 - #34055
    • 已接受,实现中
  • 私有模块目前不好使用 Not Ready
    • 本地开发 + CI/CD 都会遇到很多问题
    • 考虑 monorepo + replace
    • 考虑 vendor
# 依赖管理
go get -d github.com/path/to/module # 添加、升级
go get -d github.com/dep/two/v2@v2.1.0 # 升级到版本
go get -d github.com/dep/commit@branch # 使用分支
go get -d -u ./... # 升级全部

go get -d github.com/dep/legacy@none # 移除依赖

# 模块操作
go mod init github.com/path/to/module # 初始化模块
go mod tidy # 组织/清理 go.mod go.sum
go mod download # 下载依赖到缓存
go mod why -m github.com/path/to/module # 依赖原因
go install github.com/path/to/bin@latest # 安装

# 升级 go.mod
go mod tidy -go=1.17
# 用 1.6 选择逻辑 然后升级 1.7
go mod tidy -go=1.16 && go mod tidy -go=1.17
module github.com/wenerme/astgo
go 1.16
require (
github.com/wenerme/gou v1.0.0
)
exclude github.com/dep/legacy v1.9.2
replace github.com/dep/one => github.com/fork/one

# use vendored
replace github.com/wenerme/go-wecom => ./modules/wecom
<meta name="go-import" content="nhooyr.io/websocket git https://github.com/nhooyr/websocket mod" />

依赖更新

# 查看有更新的模块
go list -u -m all
# 查看直接依赖
# https://pkg.go.dev/cmd/go/internal/modinfo#ModulePublic
go list -u -m -f '{{.}}{{if .Indirect}} IAMINDIRECT{{end}}' all
# 只显示有更新的
go list -u -m -f '{{if .Update}}{{.}}{{end}}' all
# 只显示直接依赖
go list -u -m -f '{{if not .Indirect}}{{.}}{{end}}' all

# 更新 minor 和 patch
go get -u -v ./...
# 更新 patch
go get -u=patch -v ./...
# 更新测试依赖
go get -t -u ./...

查看模块所在位置

go list -f '{{.Dir}}' -m github.com/pkg/errors

# 模块缓存目录
go env GOMODCACHE

依赖管理

go.work

go work init
go work use ./modules/hello
go work sync

go get

自定义导入路径

GOPROXY

gitlab

go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://proxy.golang.com.cn,direct
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

# GitLab
go env -w GOPROXY='https://gitlab.example.com/api/v4/projects/1234/packages/go,https://proxy.golang.org,direct'

# 需要关闭 SUM 因为私有项目无法被 SUM
go env -w GONOSUMDB='gitlab.com/my/project,<previous value>'

私有模块

caution
  • 私有模块使用起来非常麻烦
# 指定 private repo
go env -w GOPRIVATE=github.com/myrepo
# 整个组织
go env -w GOPRIVATE=gitlab.com/myorg/*

# git 添加授权信息 - 如果本地有 ssh-agent 应该可以直接访问
# 可以 SSH url."git@github.com".insteadOf "https://github.com"
# 可以 netrc
git config --global url."https://$USERNAME:$ACCESS_TOKEN@github.com".insteadOf "https://github.com"

# git 确认可以访问
git ls-remote -q https://github.com/myrepo/module.git

~/.netrc

machine <url> login <username> password <token>

.gitconfig

[url "ssh://git@git.example.com:7999"]
insteadOf = https://git.example.com/scm

vendor

  • vendor/
    • modules.txt

monorepo go mod tidy

ls **/*/go.mod | xargs dirname | xargs -I {} sh -c 'cd {}; go mod tidy'
# or
find . -name go.mod | xargs dirname | xargs -I {} sh -c 'cd {}; go mod tidy'