内容目录
背景
在项目开发过程中,难免会伴随开发语言的升级和项目的交接,这过程中项目的开发语言版本不一致不可避免,那么就涉及到怎么进行开发语言的多版本配置,让开发机可以多版本共存,这里以go为例,其他语言原理类似。
go版本配置
这里我写成了一个shell脚本
#!/bin/bash
# ==============================================================================
# 脚本功能: 自动下载、安装并配置指定版本的 Go 语言环境
# 运行环境: Debian / Ubuntu (需要 sudo 权限)
# 使用方法: sudo ./install_go.sh <版本号>
# 示例: sudo ./install_go.sh 1.19.9
# ==============================================================================
# --- 脚本安全设置 ---
# -e: 如果任何命令返回非零退出状态,立即退出脚本
# -u: 如果尝试使用未声明的变量,视为错误并立即退出
# -o pipefail: 如果管道中的任何命令失败,则整个管道的退出状态为失败
set -euo pipefail
# --- 变量定义 ---
# 从命令行第一个参数获取 Go 版本号
GO_VERSION=${1-} # 使用 ${1-} 避免在未提供参数时触发 set -u
# 下载和安装路径
DOWNLOAD_DIR=/root/chenjiesoft
INSTALL_DIR=/usr/local
# 检查是否以 root 用户运行
if [ $(id -u) -ne 0 ]; then
echo 错误:此脚本需要以 root 权限运行。请使用 'sudo'。 >&2
exit 1
fi
# 检查是否提供了版本号参数
if [ -z $GO_VERSION ]; then
echo 错误:请提供 Go 的版本号作为参数。 >&2
echo 用法: sudo $0 <版本号> >&2
echo 示例: sudo $0 1.19.9 >&2
exit 1
fi
# --- 动态生成变量 ---
# 根据完整版本号生成主次版本号 (例如 1.19.9 -> 1.19)
GO_MAJOR_MINOR_VERSION=$(echo $GO_VERSION | cut -d'.' -f1,2)
# 最终安装路径 (例如 /usr/local/go1.19)
FINAL_GO_PATH=${INSTALL_DIR}/go${GO_MAJOR_MINOR_VERSION}
# 下载文件名和URL
FILENAME=go${GO_VERSION}.linux-amd64.tar.gz
DOWNLOAD_URL=https://mirrors.aliyun.com/golang/${FILENAME}
# --- 主逻辑开始 ---
echo --- 开始安装 Go 版本: ${GO_VERSION} ---
# 1. 创建下载目录
echo [1/6] 检查并创建下载目录: ${DOWNLOAD_DIR}
mkdir -p ${DOWNLOAD_DIR}
# 2. 下载 Go 安装包
echo [2/6] 正在从阿里云镜像站下载 Go 安装包...
echo URL: ${DOWNLOAD_URL}
wget -c -P ${DOWNLOAD_DIR} ${DOWNLOAD_URL}
echo 下载完成。
# 3. 清理旧的安装
echo [3/6] 清理可能存在的旧版本...
# 如果目标目录存在,先删除
if [ -d ${FINAL_GO_PATH} ]; then
echo 发现已存在的目录 ${FINAL_GO_PATH},正在删除...
rm -rf ${FINAL_GO_PATH}
fi
# 解压时会生成一个名为 go 的目录,如果它存在也一并删除,防止冲突
if [ -d ${INSTALL_DIR}/go ]; then
echo 发现临时的 ${INSTALL_DIR}/go 目录,正在删除...
rm -rf ${INSTALL_DIR}/go
fi
echo 清理完成。
# 4. 解压到 /usr/local
echo [4/6] 正在解压 ${FILENAME} 到 ${INSTALL_DIR} ...
tar -C ${INSTALL_DIR} -xzf ${DOWNLOAD_DIR}/${FILENAME}
echo 解压完成。
# 5. 重命名目录
echo [5/6] 正在重命名 ${INSTALL_DIR}/go 为 ${FINAL_GO_PATH} ...
mv ${INSTALL_DIR}/go ${FINAL_GO_PATH}
echo 重命名完成。
# 6. 使用新的 Go 环境配置 GOPROXY
echo [6/6] 正在使用新的 Go 执行文件配置 GOPROXY...
# 使用新安装的 go 命令设置全局 GOPROXY
# 推荐使用 goproxy.cn,它是专为中国开发者服务的代理
${FINAL_GO_PATH}/bin/go env -w GO111MODULE=on
${FINAL_GO_PATH}/bin/go env -w GOPROXY=https://goproxy.cn,direct
echo
echo --- Go ${GO_VERSION} 安装和配置成功! ---
echo
# 验证 GOPROXY 是否设置成功
echo 验证 GOPROXY 设置:
${FINAL_GO_PATH}/bin/go env | grep GOPROXY
脚本内容根据命令输入的版本去镜像站,这里我找的是阿里的镜像源速度会比较快,下载对应版本的go到指定目录,然后对指定版本设置环境变量,主要是设置GOPROXY进行mod的加速。
这里给出一个安装的输出示例可以参考:
# sudo ./install_go.sh 1.19.9
--- 开始安装 Go 版本: 1.19.9 ---
[1/6] 检查并创建下载目录: /root/chenjiesoft
[2/6] 正在从阿里云镜像站下载 Go 安装包...
URL: https://mirrors.aliyun.com/golang/go1.19.9.linux-amd64.tar.gz
--2025-07-24 14:10:35-- https://mirrors.aliyun.com/golang/go1.19.9.linux-amd64.tar.gz
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 47.123.21.201, 47.123.21.200, 47.123.21.204, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|47.123.21.201|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 149067328 (142M) [application/octet-stream]
Saving to: ‘/root/chenjiesoft/go1.19.9.linux-amd64.tar.gz’
go1.19.9.linux-amd64.tar.gz 100%[===========================================================================================================>] 142.16M 9.97MB/s in 14s
2025-07-24 14:10:50 (9.84 MB/s) - ‘/root/chenjiesoft/go1.19.9.linux-amd64.tar.gz’ saved [149067328/149067328]
下载完成。
[3/6] 清理可能存在的旧版本...
清理完成。
[4/6] 正在解压 go1.19.9.linux-amd64.tar.gz 到 /usr/local ...
解压完成。
[5/6] 正在重命名 /usr/local/go 为 /usr/local/go1.19 ...
重命名完成。
[6/6] 正在使用新的 Go 执行文件配置 GOPROXY...
--- Go 1.19.9 安装和配置成功! ---
验证 GOPROXY 设置:
GOPROXY=https://goproxy.cn,direct
使用vscode配置项目的go版本
在项目文件夹新建.vscode文件夹,在里面添加settings.json
{
go.goroot: /usr/local/go1.19,
terminal.integrated.env.linux: {
GOROOT: /usr/local/go1.19,
PATH: /usr/local/go1.19/bin:${env:PATH}
}
}
配置好重新打开这个文件夹vscode会自动加载配置生效,然后在vscode的终端go env 就可以看到此时项目的go语言和settings.json配置的就是一样的。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2l6n4xdre96og