Skip to content

依赖安装

bash
#!/bin/bash

# 1. 安装 asdf 和 direnv
brew install asdf direnv

# 2. 配置 zsh 启动脚本
cat >> ~/.zshrc << 'EOF'

# asdf 版本管理器
export ASDF_DIR="$HOME/.asdf"
export PATH="${ASDF_DIR}/shims:$PATH"
. "${ASDF_DIR}/asdf.sh"

# direnv 目录环境变量
eval "$(direnv hook zsh)"
EOF


# 3. 重新加载配置
source ~/.zshrc

# 4. 安装 asdf-direnv 插件(关键!否则 .envrc 里的 use asdf 不工作)
asdf plugin add direnv
asdf install direnv latest
asdf global direnv latest
asdf direnv setup --shell zsh --version latest

# 5. 安装 golang 插件
asdf plugin add golang
asdf install golang 1.24.1
asdf global golang 1.24.1

# 6. 验证
echo "安装完成,验证如下:"
asdf version
direnv version
go version

工具版本

  • 在项目根目录下面创建 .tool-versions,写入需要的 go 版本
text
golang 1.24.0

go 特有配置

  • 在项目目录下创建 .envrc
B 站版本
bash
#!/usr/bin/env bash  
  
# =============================================================================# direnv 环境配置 - 用于 Go 开发环境自动切换  
# =============================================================================# 本文件在每次进入项目目录时由 direnv 自动加载  
# 如需重新加载: direnv allow  
# 如需禁用当前目录 direnv: direnv revoke# =============================================================================  
# -----------------------------------------------------------------------------# 1. Go 版本管理 (asdf)# -----------------------------------------------------------------------------# use asdf: 读取项目 .tool-versions 文件,自动切换 Go 版本并设置 GOROOT# 要求: 已安装 asdf-direnv 插件 (asdf plugin add direnv)# 原理: asdf 会根据 .tool-versions 中的 golang 版本,自动导出 PATH 和 GOROOT#  
# 验证命令:  
#   $ asdf current golang     # 查看当前 Go 版本  
#   $ go env GOROOT           # 查看 Go 安装路径  
# -----------------------------------------------------------------------------use asdf  
  
# -----------------------------------------------------------------------------# 2. Go 基础模块配置  
# -----------------------------------------------------------------------------# GO111MODULE=on: 强制启用 Go Modules (Go 1.16+ 默认开启,显式声明避免歧义)  
export GO111MODULE="on"  
  
# GOPATH: Go 工作目录,第三方包和工具安装位置  
# 默认: ~/go  
export GOPATH="${HOME}/go"  
  
# GOBIN: Go 编译生成的可执行文件存放目录 (如 go install 的产物)  
# 需要加到 PATH 才能在任意位置使用这些工具  
export GOBIN="${GOPATH}/bin"  
  
# GOCACHE: Go 编译缓存目录,加速重复编译  
# 默认位置,显式声明避免被其他配置覆盖  
export GOCACHE="${HOME}/.cache/go-build"  
  
# -----------------------------------------------------------------------------# 3. PATH 环境变量  
# -----------------------------------------------------------------------------# 优先级顺序: GOBIN > 系统 PATH# 确保通过 go install 安装的工具优先于系统自带版本  
export PATH="${GOBIN}:${PATH}"  
  
# -----------------------------------------------------------------------------# 4. 代理配置 (依赖下载加速)  
# -----------------------------------------------------------------------------# GOPROXY: 模块下载代理地址,按优先级尝试:  
#   1. http://goproxy.bilibili.co  - B站内部代理 (内网优先)  
#   2. https://goproxy.cn         - 国内镜像 (公网备选)  
#   3. direct                     - 直连官方源 (最后尝试)  
#  
# 排查问题:  
#   - 内网时优先使用 bilibili.co#   - 外网时可能会超时,会 fallback 到 goproxy.cnexport GOPROXY="http://goproxy.bilibili.co,https://goproxy.cn,direct"  
  
# -----------------------------------------------------------------------------# 5. 私有库配置 (跳过代理和校验)  
# -----------------------------------------------------------------------------# 这些配置用于 B站内部私有仓库,避免走公网代理和 checksum 校验  
#  
# GOPRIVATE: 匹配这些域名的模块不通过 GOPROXY 下载,直接走内网 git#   - *.bilibili.co: B站内部域名通配  
#   - git.bilibili.co: 内网 GitLab#   注意: 包括 buf.bilibili.co, git.bilibili.co 等  
export GOPRIVATE="*.bilibili.co,git.bilibili.co"  
  
# GONOPROXY: 这些模块直接从版本控制下载,不走任何代理  
# 与 GOPRIVATE 保持一致即可  
export GONOPROXY="*.bilibili.co,git.bilibili.co"  
  
# GONOSUMDB: 这些模块跳过 checksum 校验  
# 解决报错: "verifying xxx: checksum mismatch"  
# 私有模块不需要也不应该进行 sum.golang.org 校验  
export GONOSUMDB="*.bilibili.co,git.bilibili.co"  
  
# -----------------------------------------------------------------------------# 6. Go 工具链配置  
# -----------------------------------------------------------------------------# GOTOOLCHAIN=local: 禁止使用自动下载的工具链  
# 默认 Go 1.21+ 会在 go.mod 的 go 版本高于本地时自动下载新版本  
# 设置 local 后强制使用 asdf 管理的版本,避免自动下载冲突  
#  
# 常见问题:  
#   - "go: downloading go1.xx.x ... verifying module: checksum database disabled"#   - 这是因为 GOSUMDB=off 时无法验证工具链下载  
#   - 解决: GOTOOLCHAIN=local 阻止自动下载  
export GOTOOLCHAIN="local"  
  
# -----------------------------------------------------------------------------# 7. 环境验证输出  
# -----------------------------------------------------------------------------# 每次进入目录时打印关键配置,方便排查问题  
# 如果看到 "direnv: loading .envrc" 但没输出,说明 .envrc 有问题  
  
echo ""  
echo "========================================"  
echo "[direnv] 加载 Go 开发环境配置"  
echo "========================================"  
  
# 检查 Go 是否可用  
if command -v go &> /dev/null; then  
    echo "[OK]   Go version: $(go version)"  
    echo "[OK]   GOROOT: $(go env GOROOT)"  
    echo "[OK]   GOPATH: ${GOPATH}"  
else  
    echo "[ERR]  Go 命令未找到,请检查 asdf 是否安装 golang 插件"  
fi  
  
# 打印代理配置 (调试用)  
echo "[INFO] GOPROXY: ${GOPROXY}"  
echo "[INFO] GOPRIVATE: ${GOPRIVATE}"  
echo "[INFO] GONOSUMDB: ${GONOSUMDB}"  
echo "[INFO] GOTOOLCHAIN: ${GOTOOLCHAIN}"  
echo "========================================"  
echo ""
私有版本
bash
#!/usr/bin/env bash

# 自动切换 Go 版本
use asdf

# 基础配置
export GOPATH="${HOME}/go"
export GOBIN="${GOPATH}/bin"
export PATH="${GOBIN}:${PATH}"

# 代理配置:公共镜像 > 直连
export GOPROXY="https://goproxy.cn,direct"

# 明确不设置私有库配置
export GOPRIVATE=""
export GONOPROXY=""
export GONOSUMDB=""

# 对于开源项目,建议启用校验和数据库
export GOSUMDB="sum.golang.org"

# 设置编译缓存
export GOCACHE="${HOME}/.cache/go-build"

# 验证
echo "[INFO] Go version: $(go version)"
echo "[INFO] Using public GOPROXY: ${GOPROXY}"

正在精进