Sublime Text 不自动识别 Gemfile 变更,因其不读取 Gemfile 或执行 bundle exec,仅依赖系统 PATH 和手动配置的 Build System;需配置 bundle exec 路径、插件命令及 gem 源码索引路径,并确保 GUI 环境加载 rbenv/shim。

Sublime Text 里 Gemfile 变更后,bundle install 生效但插件不识别新 gem?
根本原因不是 Sublime “没更新环境”,而是它压根不读 Gemfile 或运行 bundle exec —— 它只依赖系统 PATH 里的 ruby 和 bundle 命令,以及你手动配置的 Build System。插件(如 RubyTest、SublimeLinter-ruby)调用的仍是全局 ruby 解释器,不会自动切到 Gemfile.lock 指定的 gemset。
解决思路很直接:让 Sublime 的构建和插件命令走 bundle exec 路径,而不是裸调 ruby。
- 打开
Tools → Build System → New Build System…,粘贴以下内容(Mac/Linux):
{
"shell_cmd": "bundle exec ruby -w $file",
"file_regex": "^(...*?):([0-9]*):([0-9]*):? (.*)$",
"selector": "source.ruby"
}
- Windows 用户把
bundle exec ruby改成bundle exec ruby.exe,并确认bundle.bat在 PATH 中 - 保存为
Ruby Bundle.sublime-build,然后在右下角语法栏选中该 Build System - 此时 Ctrl+B 运行的是
bundle exec ruby -w your_file.rb,能正确加载Gemfile里声明的 gems(比如pry、rspec)
为什么 RubyTest 插件跑 rspec 还是报 uninitialized constant?
因为 RubyTest 默认调用的是全局 rspec 命令,而非项目级 bundle exec rspec。即使你本地 gem install rspec 成功,项目里用的是 gem 'rspec', group: :test,那全局 rspec 就找不到你的 app 类。
- 在 Sublime 里按
Cmd+Shift+P(Mac)或Ctrl+Shift+P(Win/Linux),输入Preferences: Package Settings → RubyTest → Settings - 在用户设置里补全以下字段:
{
"ruby_test_rspec_command": "bundle exec rspec",
"ruby_test_test_unit_command": "bundle exec ruby -Itest",
"ruby_test_cucumber_command": "bundle exec cucumber"
}
- 确保项目根目录有
Gemfile且已执行过bundle install - 重启 Sublime(部分插件设置需重启才生效)
Gemfile 升级 Ruby 版本后,Sublime 的 Build System 报 ruby: command not found?
这是最常被忽略的链路断点:Gemfile 里写 ruby '3.2.2' ≠ 系统就装了 3.2.2;Sublime 仍用旧 PATH 里的 ruby(比如 rbenv 全局设成 3.1.4,但项目要求 3.2.2)—— Build System 不会自动切换 rbenv 版本。
- 先确认终端里进入项目目录后,
ruby -v和which ruby输出是否符合预期(比如指向~/.rbenv/versions/3.2.2/bin/ruby) - 如果终端正常但 Sublime 不行,说明 GUI 没加载 rbenv 初始化:Mac 用户检查
~/.zprofile是否有eval "$(rbenv init - zsh)",Windows 用户确认rbenv shell 3.2.2后 PATH 是否包含对应路径 - 更稳妥的做法:在 Build System 里硬编码完整路径,例如:
"shell_cmd": "/Users/you/.rbenv/versions/3.2.2/bin/ruby -w $file"
- 避免用
~,必须写绝对路径;Apple Silicon 用户路径通常是/opt/homebrew/bin/bundle,别漏掉bundle exec包裹
Sublime 无法跳转到新 gem 的源码(比如刚 bundle add httparty)?
这不是 Sublime 的错,是它根本不解析 Ruby 代码语义。所谓“跳转定义”功能(Goto Definition)依赖的是插件(如 SublimeCodeIntel、RubySymbolList)做的字符串匹配或 AST 静态分析,它们不会主动扫描 vendor/bundle 或 ~/.rbenv/versions/…/lib/ruby/gems/ 下的 gem 源码。
- 手动添加 gem 路径到插件索引范围(以 RubySymbolList 为例):在项目根目录建
.sublime-project,加入:
{
"settings": {
"ruby_symbol_list_paths": [
"./vendor/bundle/ruby/3.2.0/gems/httparty-6.3.0/lib",
"~/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/httparty-6.3.0/lib"
]
}
}
- 注意替换版本号和 gem 名;路径必须存在且可读
- 更现实的做法:别指望跳转,用
bundle open httparty在终端直接打开源码,或用ri HTTParty查文档
Sublime 对 Gemfile 变更完全无感,所有“同步”动作都得你手动触发:改 Build System、调插件配置、硬编码路径、补索引目录。最容易被忽略的是 shell 初始化缺失导致的 PATH 断层——哪怕 bundle install 成功了,Sublime 仍可能在用系统 ruby 或旧版本 shims。


















