mac M1,M2,M3芯片踩坑 nodejs ruby brew
问题&处理方法
先说处理方法, 感兴趣的能够了解工作的经过, 或许我描绘的问题不专业, 但的确处理了当下的问题, 欢迎留言评论
这儿主要是两个问题, 一个是启用rosetta
形式失利, 一个是架构混合导致项目跑不起来
启用rosetta
形式失利
履行 arch -x86_64 zsh
报arch: 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
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
对了, 一般咱们还会运用iterm2代替mac的终端, 并运用zsh作为shell解说器, 是的, 再装置一个oh-my-zsh
这个时分你应该能履行nvm
指令了
# 列出一切能够装置的 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
环境中运转指令和装置软件。
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.2
的ruby
, 电脑自带的是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, [email protected] 这些依靠, 我装置的应该是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, 必定要注意架构差异