当前位置:首页 > 操作系统 > 正文内容

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

邻居的猫1个月前 (12-09)操作系统2062

问题&处理方法

先说处理方法, 感兴趣的能够了解工作的经过, 或许我描绘的问题不专业, 但的确处理了当下的问题, 欢迎留言评论

这儿主要是两个问题, 一个是启用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

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.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, [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, 必定要注意架构差异

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=630

分享给朋友:

“mac M1,M2,M3芯片踩坑 nodejs ruby brew” 的相关文章

linux配置hadoop环境变量,岖疆hadoop

linux配置hadoop环境变量,岖疆hadoop

在Linux系统上配置Hadoop环境变量通常包括以下几个步骤:1. 打开bashrc文件:这个文件通常位于`~/.bashrc`。2. 添加Hadoop环境变量:在文件中添加以下行,确保``是Hadoop安装目录的路径。 ```bash export HADOOP_HOME= expo...

windows10是什么系统

windows10是什么系统

Windows 10是微软公司开发的一款个人电脑操作系统,首次发布于2015年7月29日。它是Windows NT操作系统系列的最新版本,也是Windows 8和Windows 8.1的继任者。Windows 10引入了许多新的功能和改进,包括一个全新的开始菜单、改进的多任务处理能力、增强的触摸支持...

虚拟机安装linux系统,虚拟机安装Linux系统全攻略

安装Linux系统到虚拟机是一个相对简单的过程,下面我将为您提供一个基本的步骤指南。请注意,不同的虚拟化软件(如VirtualBox、VMware、HyperV等)可能会有一些微小的差异,但总体步骤大致相同。 1. 准备工作 下载Linux发行版:选择您想要安装的Linux发行版(如Ubuntu、C...

php执行linux命令, PHP执行Linux命令的方法

在PHP中执行Linux命令通常可以通过使用`exec`, `shell_exec`, `system`, `passthru`等函数实现。这些函数允许你从PHP脚本中执行Shell命令。但是,使用这些函数时需要注意安全性和性能问题,因为它们可能会允许执行任意命令,从而可能被用于安全漏洞。1. `e...

linux下载gcc

linux下载gcc

在Linux系统上下载和安装GCC(GNU Compiler Collection)通常是通过包管理器来完成的。不同的Linux发行版有不同的包管理器。以下是几个常见的Linux发行版及其对应的包管理器,以及如何使用它们来安装GCC:1. Debian/Ubuntu: 使用`apt`包管理器。...

linux命令全称,二、基本命令全称解析

linux命令全称,二、基本命令全称解析

1. `ls` list(列出目录内容)2. `cd` change directory(改变目录)3. `cp` copy(复制文件或目录)4. `mv` move(移动或重命名文件或目录)5. `rm` remove(删除文件或目录)6. `mkdir` make directory...