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, 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, 一定要注意架构差异
mac M1,M2,M3芯片踩坑 nodejs ruby brew的更多相关文章
- T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式
时间:2017-09-11 整理:byzqy 题目:有个年度统计表,结构如下: 怎么样把这个表,查询成这样一个结果: 这是在面试过程中遇到的一个关于数据库的题,没有一点思路,不知它考查到的知识点是什么 ...
- MAC下STF安装及踩坑
[Mac OS X]brew: command not found ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebr ...
- 在mac下初次使用pygame踩坑纪实(卡死)
初次使用pygame实现绘图功能就踩坑 直接上代码 import pygame pygame.init() # 创建游戏的窗口 480 * 700screen = pygame.display.set ...
- Mac系统STF自动化环境搭建及部署踩坑记录
因为公司需要寻找一个免root的自动化测试方案,所以以前做的老方案需要被替代.一阵搜寻找到了这个框架,但是部署起来很是折腾,搞了一下午终于搞定,顺便记录一下过程,有需要的自取. 转载请注明出处:htt ...
- 在Mac osx使用ADT Bundle踩过的坑
前言 本篇博客整理一下笔者在Mac下使用ADT Bundle踩过的坑,Google现在也不支持Eclipse了,开发者也到了抛弃Eclipse的时候,但考虑到大部分Java的开发者还是比较习惯与Ecl ...
- openssl1.0在mac下的编译安装(踩坑精华)
之前做了一次brew版本升级,然后用pip3安装的一个python命令就无法执行了(涉及到openssl库),执行就会报一个错误. ImportError: dlopen(/usr/local/Cel ...
- Gitbook部署之nodejs踩坑
title: Gitbook部署之nodejs踩坑 date: 2020-11-06 16:34:30 summary: Gitbook部署和NVM的使用.hexo失效 Gitbook部署之nodej ...
- 在mac版virtual box中安装ubuntu虚拟机的NAT/Host-Only网络配置踩坑记录
之前用惯了vmware和parallels desktop,网络配置十分智能,基本不用自己配置.由于版权原因,工作电脑上换了免费的virtual box用,四五年都完全在虚拟机里干活的本菜鸡居然在虚拟 ...
- Mac下Charles踩坑记录
初次使用Charles,摸索着抓包的过程中遇到了很多问题.在这里一一记录一下,避免其他初学者踩坑. 问题1:不显示request和response? 在Charles的配置页面可以勾选是否把reque ...
- React Native Android配置部署踩坑日记
万事开头难 作为一只进入ECMAScript世界不久的菜鸟,已经被React Native的名气惊到了,开源一周数万星勾起了我浓烈的兴趣.新年新气象,来个HellWorld压压惊吧^_^(故意少打个' ...
随机推荐
- 第九节 JMeter基础-高级登录【接口关联-鉴权】
声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 背景:电商的功能:登录.加入购物车.提交订单.问题:谁把什么商品加入了购物车?这时需要把上一个接口的响应数据(登录成功后返回 ...
- 「模拟赛」暑期集训CSP提高模拟4(7.21)
很祭的一次比赛,啥也不会. 题目列表: A.White and Black B.White and White C.Black and Black D.Black and White A.White ...
- Python项目批量管理第三方包(requirements.txt)
python项目中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号,以便新环境部署. requirements.txt可以通过pip命令自动生成和安装 生成re ...
- 关于@Mapper与@MapperScan
o.m.s.mapper.ClassPathMapperScanner : Skipping MapperFactoryBean with name 'gggDao' and 'com.xxx.dao ...
- 【MySQL】01 概念与介绍
视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax 用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...
- 【SVN】提交失败报错
SVN提交失败: 最后信息是提示 请输入日志消息,至少需要20个字符,提交终止 问题原因是: 提交的时候不要把提交信息换行来写,SVN只会读取第一行内容 如果消息没有问题还提交失败,可能是文件因为提交 ...
- OneFlow是否真的实现了单机代码无侵害的运行在分布式集群上?
答案: 不是,但也是. 严格意义上来说,不是. 因为技术OneFlow的代码,要从单机改到分布式,也需要改配置,需要给所有的变量设置具体的全局存储还是局部存储,如果局部存储又应该如何划分,等等,这些其 ...
- 对于围棋AI作弊的一些思考
最近看到些关于围棋AI作弊的报道有了一些思考. 相关视频链接: https://www.bilibili.com/video/BV1np411f73b/?spm_id_from=autoNext ht ...
- LVGL line组件
目录 一.Line(线条)的概念 二.线条组件的使用 1.创建线条对象 2.设置点数组 3.确定y轴的方向(可选) 4.设置线条风格(可选) 4.1创建风格 4.2设置风格 5.将创建好的线段组件添加 ...
- WPF 怎么把checkbox改成开关样式
先看一下效果吧: isChecked = false 的时候的效果 isChecked = true 的时候的效果 然后我们来实现一下这个效果吧 第一步:创建一个空的wpf项目: 第二步:在项目里面添 ...