mac M1,M2,M3芯片踩坑 nodejs ruby brew

问题&解决方法

先说解决方法, 感兴趣的可以了解事情的经过, 也许我描述的问题不专业, 但确实解决了当下的问题, 欢迎留言讨论

这里主要是两个问题, 一个是启用rosetta模式失败, 一个是架构混合导致项目跑不起来

启用rosetta模式失败

执行 arch -x86_64 zsharch: posix_spawnp: zsh: Bad CPU type in executable

原因: 未安装rosetta

执行softwareupdate --install-rosetta安装rosetta报

Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute

原因: 系统版本低无法安装, 更新系统

架构混合导致项目跑不起来

arm64架构下安装了brew, 执行arch -x86_64 zsh后, 导致brew安装了x86架构的命令工具, 通过rvm安装ruby时又因为brew的架构只能安装arm64的, 运行项目时报

LoadError - dlopen(/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle, 0x0009): tried: '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (no such file), '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')) - /Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle

原因: brew安装了不同架构的命令工具

解决方法: 统一架构, 先卸载brew, 统一安装x86架构的工具

在你执行了arch -x86_64 zsh, 且安装了brew的情况下

不妨检查一下安装的brew的架构

which brew

# 这是x86模式下安装的brew
/usr/local/bin/brew

# 这是arm模式下安装的brew
/opt/homebrew

背景

公司配了一台M3的MacBook Pro, 配置确实高, 速度也很快

作为一个前端开发, nodejs必不可少, 公司项目需要用到低版本的nodejs(<=14), 这里我们一般会用到nvm管理nodejs版本

所以, 第一步, 安装nvm

bash 复制代码
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

对了, 一般咱们还会使用iterm2替代mac的终端, 并使用zsh作为shell解释器, 是的, 再安装一个oh-my-zsh

这个时候你应该能执行nvm命令了

bash 复制代码
# 列出所有可以安装的 Node.js 版本
nvm ls-remote
# 安装最新的稳定版
nvm install latest

安装14以后的版本(>=15)是没问题的, 安装12会有一大堆编译信息, 等待十多分钟会发现报错, 无法使用

解决办法

使用rosetta模式

在 Apple Silicon Macs 上,你可以使用 Rosetta 2 来运行 x86_64 架构的应用程序,包括终端 shell。使用 arch -x86_64 zsh 命令可以启动一个通过 Rosetta 2 运行的 zsh shell,这样你就可以在 x86_64 环境中运行命令和安装软件。

bash 复制代码
arch -x86_64 zsh

正常情况下, 咱执行会提示安装 Rosetta 2 , 如果已经安装则没有反馈, 然后就可以执行 nvm install 12 安装nodejs了

天有不测风云, 我居然报错了

arch: posix_spawnp: zsh: Bad CPU type in executable

这就让我觉得莫名其妙了

通过搜索, 我明白我需要先安装Rosetta 2, 可以通过执行

softwareupdate --install-rosetta

正常情况下, 也是等待安装即可

而我, 又掉坑里了

Package reference com.apple.pkg.RosettaUpdateAuto is missing installKBytes attribute

我开始怀疑人生了, 好在我发现可能和系统版本有关, 于是我果断升级系统

确实好了, nodejs环境确实没问题了

新问题

现在需要运行ios项目, 统一使用2.7.2ruby, 电脑自带的是2.6, 没办法, 最好用一个ruby的版本管理工具 -- rvm

安装rvm需要有brew, 聪明的我在执行 arch -x86_64 zsh 之前就已经安装好了, 我真是个小机灵鬼

很快, 我就为自己的行为付出了代价

原因

由于我在执行arch -x86_64 zsh 之前安装的brew, 所以brew安装的工具都是arm64架构的, 这个时候我安装 gnupg 提示我

Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
    arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.

这个时候我就执行arch -arm64 brew install gnupg安装了arm64架构的gnupg(我也不知道干嘛的), 这个时候工具的依赖也安装的arm64架构的

在我安装其他依赖的时候, 也开始提醒我使用arm架构的方式安装

真正的坑

没错, 后来我安装了rvm, 在x86模式下, 使用arm64架构的brew安装的rvm, 你猜它是什么架构 -- 还是arm64架构

我终于可以执行 rvm install 2.7.2 安装指定版本的ruby了, 我发现安装不上, 聪明的我果然通过 arch -arm64 rvm install 2.7.2的方式安装上了arm64架构的ruby

于是我满心欢喜的去安装项目依赖了, 噩梦开始了

类似ges: autoconf, automake, libtool, pkg-config, coreutils, libyaml, libksba, readline, zlib, openssl@1.1 这些依赖, 我安装的应该是x86架构的, 这里项目用到了bundler , 是啥不重要, 就是一个工具, 跟着敲命令就完了

执行 bundler install 安装项目依赖, 然后又执行 bundle exec pod install, 这个时候问题出现了

LoadError - dlopen(/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle, 0x0009): tried: '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (no such file), '/Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')) - /Users/q/.rvm/gems/ruby-2.7.2/gems/nkf-0.2.0/lib/nkf.bundle

我看到了have 'x86_64', need 'arm64e' or 'arm64', 我就知道事情不对了, 我又把这些工具库换成arm64架构的, 还是跑不起来, 开始怀疑人生了, 于是和同事对了一下工具的版本号

我意识到ruby是arm64架构的, 导致x86的工具不能使用, 但是我又装不上x86的ruby, 一想到ruby, 我想着不用rvm管理版本, 直接下载一个, 确实也奏效了, 我逐渐意识到了问题的所在

查看ruby的架构

ruby -v
# ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-darwin24]

这里我已经换上了x86的ruby

查看brew的架构

错误的方式

在网上搜到了这个代码

brew config

HOMEBREW_VERSION: 4.3.24
ORIGIN: https://github.com/Homebrew/brew
HEAD: 916044581862c32fc2365e8e9ff0b1507a98925e
Last commit: 2 days ago
Core tap JSON: 24 Sep 09:41 UTC
Core cask tap JSON: 24 Sep 09:41 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 12
Homebrew Ruby: 3.3.4 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.4_1/bin/ruby
CPU: dodeca-core 64-bit westmere
Clang: 16.0.0 build 1600
Git: 2.39.5 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 15.0-x86_64
CLT: 16.0.0.0.1.1724870825
Xcode: 16.0
Rosetta 2: true

乍一看确实是-x86_64, 本着怀疑态度, 我执行了 arch -arm64 brew config

HOMEBREW_VERSION: 4.3.24
ORIGIN: https://github.com/Homebrew/brew
HEAD: 916044581862c32fc2365e8e9ff0b1507a98925e
Last commit: 2 days ago
Core tap JSON: 24 Sep 09:41 UTC
Core cask tap JSON: 24 Sep 09:41 UTC
HOMEBREW_PREFIX: /usr/local
HOMEBREW_CASK_OPTS: []
HOMEBREW_MAKE_JOBS: 12
Homebrew Ruby: 3.3.4 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/3.3.4_1/bin/ruby
CPU: dodeca-core 64-bit westmere
Clang: 16.0.0 build 1600
Git: 2.39.5 => /Applications/Xcode.app/Contents/Developer/usr/bin/git
Curl: 8.7.1 => /usr/bin/curl
macOS: 15.0-arm64
CLT: 16.0.0.0.1.1724870825
Xcode: 16.0
Rosetta 2: false

因为我是在arm64的架构下安装的brew, 然后执行的arch -x86_64 zsh修改终端的架构为x86

正确的方式

其实很简单, 看brew的执行路径

which brew

# 这是x86模式下安装的brew
/usr/local/bin/brew

# 这是arm模式下安装的brew
/opt/homebrew

总结

配置环境的时候, 统一版本很重要, 有时候一个小版本都会导致项目运行差异, 真可谓是 差之毫厘谬以千里

咱们遇到的这些问题, 都是处理器架构导致的, 我们要尽可能统一开发环境

这次踩坑的原因有两个

  • 自作聪明
  • 系统版本

正常情况下, 拿着 M芯片 的mac, 一定要注意架构差异

相关推荐
姚杰献2 小时前
MacOS上安装MiniConda的详细步骤
人工智能·python·深度学习·macos·机器学习·conda·mac
AUV11076 小时前
Mac剪贴板历史全记录!
macos·swiftui·mac·效率工具·实用工具·剪贴板·clipboard
一笑6 小时前
在MAC中Ollama开放其他电脑访问
mac·ollama·ollama api·ollama外网访问
AUV110714 小时前
Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐
macos·swiftui·mac·剪贴板·clipboard·剪贴板增强·app 推荐
好看资源平台2 天前
MacOS升级Ruby版本的完整指南
开发语言·macos·ruby
fly丶知秋3 天前
Node.js 版本管理工具对比总结
node.js·nvm·nvs·volta·n·fnm
AUV11073 天前
CleanClip --- 为Mac用户打造的智能剪贴板管理利器
macos·mac·效率工具·剪贴板·clipboard
Mr.Cssust3 天前
【研发日记】嵌入式处理器技能解锁(六)——ARM的Cortex-M4内核
ai·arm·cortex-m4·芯片·指令集·嵌入式软件·处理器
不能再留遗憾了3 天前
RabbitMQ 高级特性——发送方确认
分布式·rabbitmq·ruby