关于golang:M1-芯片-Mac-上更好的-Golang-使用方案

5次阅读

共计 4870 个字符,预计需要花费 13 分钟才能阅读完成。

本篇文章,将分享如何在苹果 M1 Mac 设施上,来进行高效、牢靠的 Golang 开发环境的装置和治理。

写在后面

如果你是一个 Golang 的用户,那么你大概率会遇到治理和保护 Golang 版本的诉求,如果你恰好同时须要开发调试两个不同版本的我的项目,在不思考强制跳版本的状况下,你或者就须要应用“Golang 版本管理工具”来帮忙你减轻负担了。

去年年末,我曾在一篇文章中分享过三种对于《Golang 多版本治理》的计划。

相比拟官网计划 golang/dl 或者社区计划 voidint/g 这两个更适宜装置或治理繁多版本的计划之外,我更举荐应用的计划是 gvm

它除了可能实现 golang 开发环境的疾速装置之外,还可能保障多个版本的 golang 共存,不同版本的软件依赖包都放弃失常工作。并且,它的实现和社区赫赫有名的 nvm-sh/nvmshyiko/jabba 是统一的,都是由 BASH 编写,和所须要治理的 Runtime 语言无关,可能更稳固的实现“管理工作”。

但惋惜的是,它和 M1 设施存在兼容性问题,它并不可能很好的运行,甚至能够说,齐全无奈运行。

暂且不说我是如何解决问题的,让咱们先来看看,怎么可能在数秒、几分钟内实现 Golang 开发环境的装置和切换吧。

装置和应用 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/gvm 命令都能够让装置的 gvm 命令失效。

如何应用 gvm 装置 Golang 开发环境

gvm 装置结束之后,假如咱们要装置最新的 golang 1.18.2,只须要执行上面的命令即可:

gvm install go1.18.2 -B

稍等片刻,当命令行中提醒 Installing go1.18.2 from binary source 的时候,指定 golang 开发环境就装置结束啦,是不是很简略!

除了“下载”之外,还须要执行上面的命令,将咱们刚刚下载的版本在以后的命令行环境中“激活”:

gvm use go1.18.2

如果咱们心愿刚刚下载的 golang 版本全局失效,并且作为默认的应用版本,能够在命令行前面增加 --default 参数:

gvm use go1.18.2 --default

不管应用哪一种形式,当命令执行结束之后,咱们将失去提醒:Now using version go1.18.2。接着,咱们就失常能够应用 go 了,比方执行 go version

go1.18.2 darwin/arm64

如何应用 gvm 进行多版本切换

想应用不同版本的 golang 的办法和下面其实并没有什么不同。仍旧是先应用 install 命令,装置咱们想要的版本:

gvm install go1.18.1 -B

当看到 Installing go1.18.1 from binary source 提醒之后,咱们接着应用 use 命令,激活这个版本就好了:

gvm gvm use go1.18.1
#或者
gvm gvm use go1.18.1 --default

当命令执行结束,咱们会失去相熟的 Now using version go1.18.1 提醒。

如何应用 gvm 进行编译装置

有的同学因为一些诉求,可能不想下载预编译好的内容,而是心愿进行本地编译。

那么能够在应用 install 命令下载 golang 的时候,去掉 -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,会发现上文中的装置仓库并不是官网仓库,而是我的批改版本 soulteary/gvm。那么在这里批改版本里,我到底做了哪些事件呢?

如果咱们应用官网命令进行 gvm 装置,大概率会碰到几个问题导致不能装置,当咱们应用 install 命令进行装置的时候,默认的版本会通知咱们产生了上面的谬误:

# 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 -m,失去 M1 设施的架构名称:arm64,接着欠缺下面的程序:

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 2 调整为 cut -d "." -f 1 来解决在 macOS 11.6 ~ macOS 12 以上的零碎版本中,原始程序获取版本出错的问题。

除此之外,我还调整了一些文档、装置、Golang 默认镜像等细节,如果感兴趣的话,能够浏览这里的变更记录。https://github.com/soulteary/gvm/releases/tag/1.0.24

最初

在往年 3 月份苹果发布会之后,苹果官网所有设施都辞别了 x86 处理器,实现了“去英特尔化”,自此所有设施都换上了自研的 M1 芯片。

这件事对于苹果而言不见得是一件好事,然而对于开发者而言,可能是一件麻烦事:因为再也无奈在官网渠道购买到非 ARM 架构的设施了,然而开发者生态相干的开源我的项目,其实有不少,都存在上文中提到的兼容性问题,亟待改良

心愿我的这篇文章,能够帮忙你节约大量不必要的折腾工夫,更安心的在 Mac 设施上应用 Golang 进行欢快的开发。

–EOF


本文应用「署名 4.0 国内 (CC BY 4.0)」许可协定,欢送转载、或从新批改应用,但须要注明起源。署名 4.0 国内 (CC BY 4.0)

本文作者: 苏洋

创立工夫: 2022 年 05 月 12 日
统计字数: 5381 字
浏览工夫: 11 分钟浏览
本文链接: https://soulteary.com/2022/05…

正文完
 0