遇到现象的本质总结:
现象:pod 命令绑定到 RVM Ruby 3.0.3,但执行 pod 时报缺少 json gem
表层问题:当前激活 Ruby 的 Gem 集合内缺失依赖;
深层根源:绝大多数开发者不理解 RVM Ruby 多版本隔离机制、Gem 安装作用域、CocoaPods 运行加载链路、macOS 系统原生 Ruby / RVM Ruby 两套环境割裂 ,随意sudo gem install、切换 Ruby、混用全局/独立 Gemset,最终环境互相污染。
下文分层拆解:
-
三者基础定义与相互关联
-
CocoaPods 完整运行核心原理(pod 命令启动链路)
-
你当前报错「pod 指向 rvm3.0.3 缺 json gem」精准根因分析
-
所有常见环境混乱场景归类
-
工业标准、长期稳定的 CocoaPods 环境构建流程
一、基础概念:RVM、Ruby、Gem、CocoaPods 各自是什么,相互关系
1. RVM (Ruby Version Manager)
定位:Ruby 多版本管理器
macOS 出厂自带一套系统 Ruby(/usr/bin/ruby),多个项目可能需要不同 Ruby 版本(2.7 / 3.0 / 3.1)。
系统 Ruby 不建议改动:系统大量脚本依赖它,sudo gem install 极易破坏系统组件。
RVM 作用:
-
在用户目录
~/.rvm/安装多套独立 Ruby 解释器; -
提供命令切换当前 Shell 激活哪一套 Ruby;
-
引入 Gemset(Gem 隔离容器):同一 Ruby 版本下,可以拥有多套互不干扰的 gem 依赖集合。
关键规则:
Shell 同一时间只能激活一个 Ruby 版本 + 对应一个 Gemset。
which ruby/which gem/which pod输出的路径,直接代表当前生效环境。
2. Ruby & Gem
-
Ruby:编程语言解释器;
-
Gem:Ruby 的软件包管理器(等价 JS npm / Python pip);
-
CocoaPods 本身就是一个 Ruby Gem 包 ,名称:
cocoapods。
gem install cocoapods = 下载 CocoaPods 源码 + 所有依赖(json, molinillo, xcodeproj 等)安装到当前激活 Gemset。
3. CocoaPods
CocoaPods = 运行在 Ruby 之上的 iOS/macOS 依赖管理工具
没有 Ruby,pod 命令完全无法执行。
完整依赖链:
scss
Shell终端 → Ruby解释器 → Gem库集合 → cocoapods(gem) → pod命令
4. 三者层级从属关系(重中之重,90%人搞反)
yaml
RVM(管理层)
└── Ruby Interpreter A (ruby-3.0.3)
├── Gemset: default(默认容器)
└── Gemset: ios-pods(自定义隔离容器)
├─ gem: cocoapods
├─ gem: json
└─ ...所有依赖
└── Ruby Interpreter B (ruby-3.1.4)
└── 独立另一套Gem集合
系统Ruby(不受RVM管理,独立平行环境:/usr/bin/ruby)
核心逻辑边界:
-
Gem 是依附于【激活的 Ruby + 当前 Gemset】,不是全局通用;
-
在 ruby-3.0.3@default 安装的 cocoapods,切换到同版本另一个 gemset,gem 全部消失;
-
切换 Ruby 版本(3.0.3 →3.1.4),所有 gem 相互隔离;
-
RVM 只管理
~/.rvm下 Ruby,管不动系统 /usr/bin/ruby。
二、CocoaPods pod 命令启动完整核心原理(环境混乱知识盲区核心)
执行一条 pod install 发生了什么?
步骤1:Shell 查找 pod 可执行文件
终端输入 pod,shell 通过 PATH 环境变量按顺序寻找 pod 脚本:
-
如果 RVM 已激活当前 Ruby:
~/.rvm/rubies/ruby-3.0.3/bin/pod -
如果使用系统Ruby:
/usr/local/bin/pod或/Library/Ruby/Gems/xxx
pod文件本质:一段 Ruby 启动脚本,硬绑定安装它时对应的 gem 环境。
步骤2:pod 脚本启动当前 Ruby 解释器
pod 脚本头部会加载 Ruby,随后告诉 Ruby:去当前环境的 Gem 路径加载 cocoapods 库。
⚠️ 致命误区:
很多人以为「pod 文件在哪,就用哪套环境」。
真实规则:pod 执行时,使用的是【当前Shell已经激活的Ruby环境】
场景举例(你的现状):
-
你用 rvm 激活 ruby-3.0.3
-
which pod输出 rvm 目录下的 pod -
这个 pod 依赖众多 gem(json 是基础依赖)
-
虽然 pod 存在,但当前激活 Ruby 的 Gemset 内没有安装 json gem
→ 直接报错:cannot load such file -- json
步骤3:CocoaPods 内部执行流程(扩展理解,构建环境时不需要改动)
markdown
pod install
1. 读取 Podfile
2. 通过 Molinillo 求解依赖版本
3. 下载 Pod 源码
4. 生成 Pods/ 目录
5. 使用 xcodeproj gem 修改 .xcworkspace / .pbxproj 项目文件
6. 执行 Pods 内 Target 构建配置
xcodeproj、json、molinillo、fuzzy-finder 全部是独立 Ruby gem,缺失任意一个直接崩溃。
一条黄金结论(解决90%环境问题)
which ruby决定一切。pod 只是跑在当前ruby上的应用;gem 是否存在,只看当前ruby+gemset。
三、针对你的场景深度分析:pod指向rvm 3.0.3,但缺失json gem
现象复盘
bash
which ruby → ~/.rvm/rubies/ruby-3.0.3/bin/ruby
which pod → ~/.rvm/rubies/ruby-3.0.3/bin/pod
执行 pod xxx → LoadError: cannot load such file -- json
可能的4条真实成因(按出现概率排序)
成因1:切换过Gemset,cocoapods装在别的gemset(最高频)
示例:
-
曾经在
ruby-3.0.3@pods执行gem install cocoapods(完整依赖全部装好) -
现在终端自动切回
ruby-3.0.3@default -
default 这个gemset没有安装任何gem
-
但PATH里仍然找到rvm下的pod二进制
运行pod时,ruby去default gemset寻找json,找不到 → 报错。
验证命令:
bash
rvm current # 查看当前 ruby@gemset
gem list # 列出当前环境所有已安装gem
执行 gem list | grep json,大概率无输出。
成因2:手动清理过gem / 执行过 gem cleanup
gem cleanup 会删除旧版本gem,如果误删基础依赖 json;
CocoaPods 不会单独重装依赖,只会在 gem install cocoapods 时自动拉全量依赖。
成因3:RVM 自动切换机制冲突(rvm autoenv / .ruby-version 文件)
项目目录存在 .ruby-version / .ruby-gemset,进入文件夹自动切换环境;
你在外部终端安装cocoapods,进入项目自动切到空gemset,出现「外面能用pod,项目内pod报错」。
成因4:混合使用 sudo gem install
一旦混用 sudo,gem 被安装到系统Ruby路径,不在RVM用户Gem路径;
RVM Ruby环境永远读取不到系统gem,依赖天然缺失。
❌ 终极禁忌:在RVM管理的Ruby环境中使用
sudo gem install
sudo 会重置环境变量,调用系统ruby,gem装到系统位置,RVM环境完全不可见。
四、常见所有 CocoaPods 环境混乱大盘点(根源都是不理解隔离机制)
- 系统Ruby 和 RVM Ruby来回混用
一会儿 /usr/bin/ruby,一会儿 rvm ruby,两套独立gem,pod 时而存在时而缺失;
- 同一Ruby多Gemset,安装gem不区分作用域
以为装一次全局可用,实际上每个gemset相互隔离;
- 随意执行 sudo gem install cocoapods
产生两套pod:一套系统pod,一套rvm pod,which pod 结果飘忽不定;
- 多Ruby版本共存,PATH顺序混乱
rvm初始化脚本 ~/.zshrc / ~/.bashrc 放置位置不对,打开新终端RVM不自动加载;新开终端直接落到系统ruby;
- 升级Ruby后,旧gem无法迁移
Ruby大版本变更,gem需要重新安装,很多开发者直接复制gem目录,产生二进制兼容错误;
- 同时存在 Homebrew Ruby + RVM Ruby + 系统Ruby 三套Ruby
PATH优先级大乱,ruby 命令指向飘忽不定,史诗级混乱。
五、标准、长期稳定:干净的 CocoaPods 环境构建方案(RVM路线)
设计目标:
✅ 和系统Ruby完全隔离,绝不污染系统;
✅ 独立Gemset专门用于CocoaPods,不和其他Ruby项目依赖冲突;
✅ 新终端、项目内环境统一,不会随机切换;
✅ 避免各种LoadError缺失gem问题。
前置提醒:macOS 新系统(Ventura+)系统强化保护,禁止修改系统Ruby,全部推荐RVM方案,不要原生系统ruby装pod。
步骤0:环境自检,先理清当前混乱状态
逐条执行,记录输出:
bash
# 1. 当前生效ruby
which ruby
ruby -v
# 2. 当前pod位置
which pod
# 3. 当前rvm环境
rvm current
# 4. 查看已安装Ruby版本
rvm list
# 5. 当前已安装gem
gem list
# 6. 检查shell配置是否加载rvm
cat ~/.zshrc | grep rvm
步骤1:规范安装RVM(如果尚未安装)
bash
# 官方安装脚本
curl -sSL https://get.rvm.io | bash -s stable
安装完成后,RVM会提示你在shell配置文件载入脚本
bash
# zsh用户(mac默认)追加至 ~/.zshrc
source ~/.rvm/scripts/rvm
生效配置
bash
source ~/.zshrc
验证:
bash
type rvm | head -1
# 输出 rvm is a function → 正确加载;若只是command,代表加载失败,后续持续出问题
步骤2:安装指定Ruby版本(推荐3.0.x,兼容当前稳定CocoaPods)
bash
# 安装 ruby 3.0.3
rvm install 3.0.3
不要使用过高Ruby版本,过高版本会出现部分旧cocoapods插件兼容性问题;3.0.x是当前平衡兼容性最优版本。
步骤3:创建独立专属Gemset(最关键隔离操作,杜绝依赖污染)
不要直接使用 default gemset!
bash
# 创建专属gemset:ruby-3.0.3@cocoapods
rvm use 3.0.3@cocoapods --create
执行后当前环境锁定:ruby-3.0.3@cocoapods
设置这个gemset为默认环境,新开终端自动激活:
bash
rvm use 3.0.3@cocoapods --default
步骤4:在干净独立Gemset安装CocoaPods
⚠️ 禁止加 sudo
bash
# 更新gem源(可选,国内建议替换rubygems镜像加速)
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
# 安装cocoapods,自动拉齐全部依赖(json、xcodeproj等)
gem install cocoapods
验证安装完整性:
bash
pod --version
gem list | grep json
# 能够看到json版本,代表依赖完整,不会再出现LoadError
步骤5(可选推荐):项目固定环境,防止意外切换
进入iOS项目根目录
bash
# 指定本项目使用的ruby与gemset
rvm --ruby-version use 3.0.3@cocoapods
自动生成两个文件:
-
.ruby-version -
.ruby-gemset
后续cd进入项目目录自动切换到pod专用环境,cd离开自动恢复,避免环境漂移。
步骤6:清理历史混乱(重要)
-
不要在系统Ruby执行任何
gem install; -
找到旧环境残余pod,避免PATH冲突:
bash
# 如果存在系统pod,卸载(不加sudo操作系统gem会失败,不用强行处理)
sudo gem uninstall cocoapods
- 若曾经brew安装过ruby,不需要就卸载,减少多Ruby冲突源:
brew uninstall ruby
六、故障快速修复:你当前「缺少json gem」立刻可用的修复命令
在确认rvm正确激活目标环境 3.0.3@xxx 之后
bash
# 重新完整安装cocoapods,自动补齐所有缺失依赖
gem install cocoapods
# 如果想要彻底修复损坏的gem环境
gem cleanup
gem install cocoapods
不要手动单独
gem install json治标不治本,后续还会缺失其他依赖;重新安装cocoapods是标准修复方式。
七、长期使用几条硬性规范(规避所有环境灾难)
-
RVM Ruby环境下,永远禁止 sudo gem install;
-
CocoaPods 单独使用一个独立Gemset,不和后端Ruby项目共用;
-
不在系统Ruby上安装任何业务gem(cocoapods、rails等);
-
不随意同时维护 Homebrew Ruby + RVM Ruby 两套;
-
升级cocoapods:依旧在对应gemset执行
gem update cocoapods; -
出现任何pod报错,第一条排查命令:
rvm current && gem list,确认当前环境和gem清单。