Golang中如何安全安装go1.21.4并保留go1.20.4版本

Golang中如何安全安装go1.21.4并保留go1.20.4版本 你好, 我是一名 Gentoo Linux 新手用户。我当前 Gentoo 工作站中的 Go 版本是 go1.20.4,它被以下软件包依赖:

equery d go
 * These packages depend on go:
app-metrics/prometheus-2.43.0-r2 (>=dev-lang/go-1.18)
app-shells/fzf-0.39.0 (>=dev-lang/go-1.18)
dev-lang/go-1.20.4 (dev-lang/go)
dev-util/android-tools-34.0.0 (dev-lang/go)
dev-util/promu-0.14.0 (>=dev-lang/go-1.18)
sys-libs/libcap-2.69 (tools ? dev-lang/go)

在这种情况下,我无法通过常规方式安装最新的 go1.21.4 版本来构建一些高级网络项目。官方软件包已经下载并安装在了 “/usr/local/” 目录下,我只能通过调用二进制路径 /usr/local/go/bin/go 来执行目标项目的构建。我刚在 https://go.dev/doc/ 阅读了一些基础教程,但还没有找到针对我问题的准确描述。

请告诉我官方或常规的方法,如何从像 “/usr/local” 这样的本地路径中选择 go 编译器的版本。

谢谢


更多关于Golang中如何安全安装go1.21.4并保留go1.20.4版本的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

目前我灵活地使用 makefile 来调用 go1.21.4 以及 Gentoo 系统的 go1.20。有没有比 makefile 更好的方法?我不确定使用 makefile 并指定 $(GO) 变量来用本地安装的 Go 版本构建 Go 项目是否足够健壮,如果你觉得这种方法很灵活,请告诉我。

谢谢。

更多关于Golang中如何安全安装go1.21.4并保留go1.20.4版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Christophberger, 感谢您的建议。我已经使用我的替代方案完成了那些Go项目的编译和测试。在Gentoo的方式中,应该为go提供slots,通过它我们可以调用

eselect list go
eselect set go NUMBER

来指定Gentoo系统中已安装的go版本。我将在自己项目的更深层次开发循环中尝试您的建议。

衷心感谢!!!

确实,这是一个特殊情况。

关于此问题,有两个快速的想法——

  1. 也许 direnv 能帮上忙?这个工具使用 .envrc 文件来指定特定文件夹的环境设置。当你 cd 进入这样一个文件夹时,.envrc 中的设置会生效;当你 cd 离开该文件夹时,这些设置就会消失。这可能是改变 Go 路径而不干扰 build.sh 的一种方法。

  2. 如果 go.mod 文件要求,Go 1.21 能够下载新版本 Go 的工具链。这样一来,无论 go.mod 文件要求的最低 Go 版本是什么,当前安装的 Go 命令都将能够编译该代码。不幸的是,你得等到 Gentoo 的软件包更新到 Go 1.21……

你好,欢迎来到论坛。

有几种方法可以并排安装多个 Go 版本。

内置的方法是 go install

$ go install golang.org/dl/go1.18.3@latest
$ go1.18.3 download

这个版本的二进制文件可以通过 go1.18.3 来调用。

为了更方便,有几个第三方工具可以管理 Go 版本,例如:

阅读更多详细信息:如何同时使用多个 Go 版本

尊敬的ChristophBerger先生:

感谢您的宝贵建议。在我的使用场景中,有一些其他的Go项目会调用build.sh作为其构建器,而这些项目的go.mod文件中包含了不同版本的Go。在最简单的情况下,我可以部署特定的Makefile,通过调用不同于go的字符串路径来调用自定义安装的Go版本进行构建。然而,在大多数实际情况下,这些项目使用build.sh来构建项目,我认为在脚本build.sh中将go替换为go1.xx.yy存在一定的风险。

对于第三方项目,我更希望有一天能为go编写一个anaconda环境管理方案……目前,我构建这些(使用脚本的)项目的替代方案是,在~/.bashrc或~/.zshrc文件中添加一行#export PATH="/usr/local/go/bin:$PATH",以根据特定Go项目所需的版本覆盖Gentoo Linux系统中go的系统路径。在我的使用场景中,这不会影响Portage/emerge,因为我们(Gentoo用户)通常以root身份切换来管理Portage中的@world集合。

再次感谢您的宝贵建议,并期待与您再次交流。

此致 敬礼

在Gentoo Linux中安全安装go1.21.4并保留go1.20.4版本,可以通过以下方法实现:

1. 使用官方二进制包安装(推荐)

从官网下载并解压到独立目录:

# 下载go1.21.4
wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz

# 解压到独立目录(不覆盖系统版本)
sudo tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz

# 重命名目录以避免冲突
sudo mv /usr/local/go /usr/local/go1.21.4

2. 配置环境变量选择版本

创建版本切换脚本:

# 创建go版本管理脚本
cat > ~/.goenv << 'EOF'
#!/bin/bash
export GOROOT="/usr/local/go$1"
export PATH="/usr/local/go$1/bin:$PATH"
EOF

chmod +x ~/.goenv

使用示例:

# 切换到go1.21.4
source ~/.goenv 1.21.4

# 验证版本
go version
# 输出:go version go1.21.4 linux/amd64

# 切换回系统默认
source ~/.goenv 1.20.4

3. 使用符号链接管理版本

# 创建版本切换脚本
cat > /usr/local/bin/select-go << 'EOF'
#!/bin/bash
VERSION=$1
if [ -z "$VERSION" ]; then
    echo "Usage: select-go <version>"
    exit 1
fi

if [ -d "/usr/local/go$VERSION" ]; then
    sudo rm -f /usr/local/go
    sudo ln -s /usr/local/go$VERSION /usr/local/go
    echo "Switched to go$VERSION"
else
    echo "go$VERSION not found in /usr/local/"
fi
EOF

chmod +x /usr/local/bin/select-go

# 使用示例
sudo select-go 1.21.4

4. 项目级版本控制

在项目目录中创建.go-version文件:

# 项目根目录
echo "1.21.4" > .go-version

# 创建项目构建脚本
cat > build.sh << 'EOF'
#!/bin/bash
GO_VERSION=$(cat .go-version 2>/dev/null || echo "1.20.4")
export GOROOT="/usr/local/go${GO_VERSION}"
export PATH="/usr/local/go${GO_VERSION}/bin:$PATH"

go build -o myapp .
EOF

chmod +x build.sh

5. 验证多版本共存

# 检查所有已安装版本
ls -la /usr/local/go*

# 分别测试不同版本
/usr/local/go1.20.4/bin/go version
/usr/local/go1.21.4/bin/go version

# 创建测试程序验证
cat > test.go << 'EOF'
package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Printf("Go version: %s\n", runtime.Version())
}
EOF

# 用不同版本编译
/usr/local/go1.20.4/bin/go run test.go
/usr/local/go1.21.4/bin/go run test.go

6. 保持系统包管理器版本不变

确保系统包管理器的go1.20.4保持不变:

# 阻止emerge升级go
echo "dev-lang/go" >> /etc/portage/package.mask

# 验证系统go版本保持不变
equery list go

这种方法允许你在不干扰系统依赖的情况下使用go1.21.4进行开发,同时保持系统稳定性。

回到顶部