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
目前我灵活地使用 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版本。我将在自己项目的更深层次开发循环中尝试您的建议。
衷心感谢!!!
确实,这是一个特殊情况。
关于此问题,有两个快速的想法——
-
也许 direnv 能帮上忙?这个工具使用
.envrc文件来指定特定文件夹的环境设置。当你cd进入这样一个文件夹时,.envrc中的设置会生效;当你cd离开该文件夹时,这些设置就会消失。这可能是改变 Go 路径而不干扰build.sh的一种方法。 -
如果
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进行开发,同时保持系统稳定性。

