Press "Enter" to skip to content

开发机多版本go+vscode配置

内容目录

背景

在项目开发过程中,难免会伴随开发语言的升级和项目的交接,这过程中项目的开发语言版本不一致不可避免,那么就涉及到怎么进行开发语言的多版本配置,让开发机可以多版本共存,这里以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配置的就是一样的。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注