本篇文章,将分享如何在苹果 M1 Mac 设备上,来进行高效、可靠的 Golang 开发环境的安装和管理。
写在前面
如果你是一个 Golang 的用户,那么你大概率会遇到管理和维护 Golang 版本的诉求,如果你恰好同时需要开发调试两个不同版本的项目,在不考虑强制跳版本的情况下,你或许就需要使用“Golang 版本管理工具”来帮助你减轻负担了。
去年年末,我曾在一篇文章中分享过三种关于的方案。
golang/dlvoidint/ggvm
nvm-sh/nvmshyiko/jabba
但可惜的是,它和 M1 设备存在兼容性问题,它并不能够很好的运行,甚至可以说,完全无法运行。
暂且不说我是如何解决问题的,让我们先来看看,怎么能够在数秒、几分钟内完成 Golang 开发环境的安装和切换吧。
gvm
gvm
gvm
gvm
curl -sSL https://github.com/soulteary/gvm/raw/master/binscripts/gvm-installer | bash
当命令执行完毕之后,我们可以看到类似下面的日志输出:
Cloning from https://github.com/soulteary/gvm.git to /Users/soulteary/.gvm
No existing Go versions detected
Installed GVM v1.0.24
Please restart your terminal session or to get started right away run
`source /Users/soulteary/.gvm/scripts/gvm`
source /Users/soulteary/.gvm/scripts/gvmgvm
gvm
gvmgolang 1.18.2
gvm install go1.18.2 -B
Installing go1.18.2 from binary source
除了“下载”之外,还需要执行下面的命令,将我们刚刚下载的版本在当前的命令行环境中 “激活”:
gvm use go1.18.2
--default
gvm use go1.18.2 --default
Now using version go1.18.2gogo version
go1.18.2 darwin/arm64
gvm
install
gvm install go1.18.1 -B
Installing go1.18.1 from binary sourceuse
gvm gvm use go1.18.1
#或者
gvm gvm use go1.18.1 --default
Now using version go1.18.1
gvm
有的同学因为一些诉求,可能不想下载预编译好的内容,而是希望进行本地编译。
install-B
gvm install go1.18
当命令执行完毕之后,我们会看到带有编译过程的日志:
Downloading Go source...
Installing go1.18...
* Compiling...
go1.18 successfully installed!
use
gvm
gvm~/.gvm~/.zshrc~/.bashrc
如果你希望进行软件重置,我推荐你在“卸载之后”,再次进行安装即可。
如何解决某个版本下载不顺利的问题
在上一篇内容中,我们如何解决这个问题。原理在此就不过多赘述了,感兴趣的同学自行翻阅即可。
简单来说,如果遇到下载二进制文件出现问题,可以尝试进行缓存清理:
rm -rf ~/.gvm/archive/
gvm
聊聊为了解决“兼容性”问题,我做了哪些事情。
gvm
gvm
gvminstall
# gvm install go1.18.2 -B
Installing go1.18 from binary source
ERROR: Binary Go unavailable for this platform
scripts/install
download_binary() {
mkdir -p $GO_INSTALL_ROOT >> "${GVM_ROOT}/logs/go-${GO_NAME}-download-binary" 2>&1
if [ "$(uname)" == "Darwin" ]; then
GVM_OS="darwin"
osx_major_version="$(sw_vers -productVersion | cut -d "." -f 2)"
if [ "${osx_major_version}" -ge 8 ]; then
GVM_OS_VERSION="-osx10.8"
elif [ "${osx_major_version}" -ge 6 ]; then
GVM_OS_VERSION="-osx10.6"
else
display_error "Binary Go unavailable for this platform"
rm -rf $GO_INSTALL_ROOT
rm -f $GO_BINARY_PATH
exit 1
fi
else
GVM_OS="linux"
fi
if [ "$(uname -m)" == "x86_64" ]; then
GVM_ARCH="amd64"
elif [ "$(uname -m)" == "ppc64le" ]; then
GVM_ARCH="ppc64le"
elif [ "$(uname -m)" == "aarch64" ]; then
GVM_ARCH="arm64"
else
GVM_ARCH="386"
fi
...
Binary Go unavailable for this platform
默认的程序缺少了针对 M1 设备的判断:
if [ "$(uname -m)" == "x86_64" ]; then
GVM_ARCH="amd64"
elif [ "$(uname -m)" == "ppc64le" ]; then
GVM_ARCH="ppc64le"
elif [ "$(uname -m)" == "aarch64" ]; then
GVM_ARCH="arm64"
else
GVM_ARCH="386"
fi
uname -marm64
if [ "$(uname -m)" == "x86_64" ]; then
GVM_ARCH="amd64"
elif [ "$(uname -m)" == "ppc64le" ]; then
GVM_ARCH="ppc64le"
elif [ "$(uname -m)" == "aarch64" ]; then
GVM_ARCH="arm64"
elif [ "$(uname -m)" == "arm64" ]; then
GVM_ARCH="arm64"
else
GVM_ARCH="386"
fi
install
# gvm install go1.18 -B
Installing go1.18.2 from binary source
ERROR: Failed to download binary go
再次审查上面的逻辑,可以定位到大概率出错的位置:
osx_major_version="$(sw_vers -productVersion | cut -d "." -f 2)"
if [ "${osx_major_version}" -ge 8 ]; then
GVM_OS_VERSION="-osx10.8"
elif [ "${osx_major_version}" -ge 6 ]; then
GVM_OS_VERSION="-osx10.6"
else
display_error "Binary Go unavailable for this platform"
rm -rf $GO_INSTALL_ROOT
rm -f $GO_BINARY_PATH
exit 1
fi
sw_vers
# sw_vers
ProductName: macOS
ProductVersion: 12.3.1
BuildVersion: 21E258
# sw_vers -productVersion
12.3.1
# sw_vers -productVersion | cut -d "." -f 2
3
{major}.{minor}.{revision}{major}{minor}
cut -d "." -f 2cut -d "." -f 1
除此之外,我还调整了一些文档、安装、Golang 默认镜像等细节,如果感兴趣的话,可以浏览这里的变更记录。https://github.com/soulteary/gvm/releases/tag/1.0.24
最后
在今年3月份苹果发布会之后,苹果官方所有设备都告别了 x86 处理器,完成了“去英特尔化”,自此所有设备都换上了自研的 M1 芯片。
这件事对于苹果而言不见得是一件坏事,但是对于开发者而言,可能是一件麻烦事:因为再也无法在官方渠道购买到非 ARM 架构的设备了,但是开发者生态相关的开源项目,其实有不少,都存在上文中提到的兼容性问题,亟待改进。
希望我的这篇文章,可以帮助你节约大量不必要的折腾时间,更安心的在 Mac 设备上使用 Golang 进行愉快的开发。
--EOF
我们有一个小小的折腾群,里面聚集了几百位喜欢折腾的小伙伴。
在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(添加好友,请备注实名,注明来源和目的,否则不会通过审核)
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。
如果你觉得内容还算实用,欢迎点赞分享给你的朋友,在此谢过。
如果你想更快的看到后续内容的更新,请戳 “点赞”、“分享”、“喜欢” ,这些免费的鼓励将会影响后续有关内容的更新速度。