模块和包
更新于 2023-11-27
模块
模块可以包含若干个包
模块路径
用模块路径标识一个模块模块路径定义在go.mod中go.mod所在的目录即模块的根目录模块路径包含仓库路径(网络导入需要路径)
包
包包含源文件包属于一个模块包路径是模块路径加包路径
示例
模块名 "golang.org/x/net"
包在"html"目录
包的路径是 "golang.org/x/net/html"
go.mod
txt
module example.com/my/thing //模块名
go 1.12 //当前golang版本
require example.com/other/thing v1.0.2 //依赖外部包
require example.com/new/thing/v2 v2.3.4
exclude example.com/old/thing v1.2.3
replace example.com/bad/thing v1.4.5 => example.com/good/thing v1.4.5 //包替换
retract [v1.9.0, v1.9.5]列出本地包
shell
go list
# 列出本地包
go list ...
go list -m all
#查看依赖下载路径
go list -m -json github.com/gin-gonic/gin
# 搜索本地包
go list ...xxx...关键字
| 关键字 | 作用 |
|---|---|
| package | 说明该源文件是属于哪个包 |
| import | 导入依赖的其它包 |
包导入
包名匹配导入路径的最后一段
go
//为导入包设置别名
import(
pa "pkga"
pb "pkgb"
)
//可直接引用包函数
import(
. "pkga"
)
//调用包初始化,但不引入包
import(
_ "pkga"
)
import (
"github.com/username/project" //通过project引用包
"rsc.io/quote"
)包的初始化
包按导入顺序初始化
每个包可以包含init函数,初始化时自动执行
go
func init(){
do something
}main包
当你使用main包时,程序将生成独立的可执行文件
但当程序不是main包的一部分时,Go 不会生成二进制文件。它生成包存档文件(扩展名为 .a 的文件)
包缓存
在 Go 里,go mod 下载的依赖会缓存在本地的 module cache 目录,默认在:$GOPATH/pkg/mod
以及下载的 .zip 包会放在:$GOPATH/pkg/mod/cache/download
shell
#清空
go clean -modcache
#直接删除整个module cache,相当于清空 $GOPATH/pkg/mod 目录。
rm -rf $(go env GOPATH)/pkg/mod
rm -rf $(go env GOPATH)/pkg/sumdb
#手动删除部分缓存
go mod tidy
go mod download
#重新下载依赖github包版本
Go模块(go mod)系统会从GitHub等远程仓库拉取代码
具体拉分支/tag/commit取决于go.mod中的引用的。
版本来源
| 来源类型 | 示例 | 说明 |
|---|---|---|
| 语义化版本(tag) | v1.2.3 | 最常见来自Git标签(git tag v1.2.3) |
| 分支(branch) | master/main,/develop等 | 通常通过 @branch 明确指定 |
| 提交哈希(commit) | @<commit-sha> | 精确指定某个commit(常用于测试或临时修改) |
版本选择
shell
go get github.com/gin-gonic/gin
# 拉取V*格式的tag, 默认会选择最新
# 可以在go.mod里指定版本, 例如`require github.com/user/repo v1.3.2`
go get github.com/gin-gonic/gin@develop
#在go.mod中生成一个伪版本号
#v0.0.0-20251006abcdef123456
#v0.0.0 表示没有正式 release tag;
# 20251006是时间;
#abcdef123456 是 commit 的前缀。
go get github.com/gin-gonic/gin@abcdef123456
#根据commmit ID拉取指定分支私有仓库拉取
Go模块本质上通过git clone或git fetch拉取源码
私有仓库依赖需要提前配置认证凭据(SSH key 或 HTTPS token) 并关闭官方代理(proxy.golang.org 不支持私有仓库)
shell
export GOPRIVATE=github.com/myorg/*
# GOPRIVATE控制哪些模块被认为是私有的;
export GONOPROXY=github.com/myorg/*
# GONOPROXY告诉Go不走公共代理;
export GONOSUMDB=github.com/myorg/*
# GONOSUMDB告诉Go不校验公有SumDB。SSH拉取
确保ssh可以访问代码仓库
HTTPS + Token拉取
shell
#在本地配置 ~/.gitconfig
[url "https://<TOKEN>@github.com/"]
insteadOf = https://github.com/
#CI/CD中配置
export GIT_ASKPASS=echo
export GIT_CRED_HELPER=
export GIT_TERMINAL_PROMPT=0
git config --global url."https://<TOKEN>@github.com/".insteadOf "https://github.com/"