sublime text本身不管理ruby第三方库,能否加载gem或require模块取决于构建系统是否继承完整ruby环境(如gem_home、rbenv_version等);gui启动不加载shell配置,需用zsh -l -c(macos/linux)或显式env(windows)复现终端执行环境。

Sublime Text 本身不管理 Ruby 第三方库,它只负责调用系统已安装的 ruby 命令;能否加载 gem、require 第三方库,完全取决于你配置的构建系统是否继承了正确的 Ruby 运行时环境(含 GEM_HOME、GEM_PATH、LOAD_PATH)——而不是靠插件或 Sublime 自身设置。
为什么 require 'pry' 或 require_relative 失败
常见现象是:终端里 ruby script.rb 能跑,但 Sublime 按 Ctrl+B 就报 LoadError: cannot load such file -- pry 或找不到本地 lib/ 下的模块。这不是 gem 没装,而是 Sublime 启动的进程没拿到你 shell 中的 Ruby 环境上下文——比如 rbenv 当前版本、BUNDLE_GEMFILE、GEM_HOME 全都丢失。
- 验证方式:在 Sublime 控制台(
Ctrl+`)运行import os; print(os.environ.get('GEM_HOME'), os.environ.get('RBENV_VERSION')),如果输出为None,说明环境变量根本没继承 - 终端能跑 ≠ Sublime 能跑:GUI 启动的 Sublime 不读
~/.zshrc,只可能读~/.zprofile(macOS)或系统级 PATH(Windows) - 即使
ruby -v成功,require 'bundler/setup'仍可能失败——因为 Bundler 的gemset或bundle exec上下文未激活
macOS/Linux:用登录态 shell 加载完整 Ruby 环境
关键不是“让 Sublime 找到 ruby”,而是“让它复现你在终端里输入 ruby script.rb 时的完整执行环境”。最稳的方式是强制启动一个登录态 shell:
- 构建系统中必须用
"shell_cmd": "zsh -l -c 'ruby "$file"'"(zsh 用户)或"shell_cmd": "bash -l -c 'ruby "$file"'"(bash 用户),-l是核心,它会source ~/.zprofile或~/.bash_profile,从而加载rbenv init、export GEM_HOME等全部逻辑 - 不要用
"cmd": ["ruby", "$file"]配合"path"字段——path只补PATH,不传GEM_*、BUNDLE_*等变量 - 如果你项目依赖
Gemfile,确保shell_cmd执行前已在项目根目录:可改写为"shell_cmd": "cd "$file_path" && zsh -l -c 'ruby "$file"'",否则bundle exec类逻辑会失效
Windows:硬编码 ruby.exe + 显式注入环境变量
Windows 不支持 -l 登录态 shell,也没统一的 shell 初始化机制,只能手动补全 Ruby 运行所需的最小环境变量:
- 构建系统必须用
"cmd"形式,并显式传入环境变量:{ "cmd": ["C:\Ruby32-x64\bin\ruby.exe", "$file"], "env": { "GEM_HOME": "C:\Ruby32-x64\lib\ruby\gems\3.2.0", "GEM_PATH": "C:\Ruby32-x64\lib\ruby\gems\3.2.0", "RUBYOPT": "-r rubygems" }, "working_dir": "$file_path", "file_regex": "^([^:]*?):([0-9]+):" } -
GEM_HOME和GEM_PATH必须与你的 Ruby 安装匹配;路径中的反斜杠必须双写,且不能含空格(如C:Program Files会静默失败) - 若项目用了 Bundler,仅设
GEM_HOME不够,得改用"cmd": ["C:\Ruby32-x64\bin\bundle.bat", "exec", "ruby", "$file"],并确认bundle.bat存在
require_relative / lib/ 目录找不到?检查 working_dir 和 $file_path
Sublime 的 $file_path 是当前文件所在目录,不是项目根目录。很多脚本假设自己从项目根运行(如 require_relative 'lib/my_tool'),但 Sublime 默认在文件所在目录执行,导致路径错位。
- 最简解法:在构建系统中加
"working_dir": "$project_path",前提是已通过Project → Save Project As…保存了.sublime-project文件 - 无项目文件时,可用
"working_dir": "$file_path/../.."向上跳两级,但不可靠;更稳妥的是用 shell 包裹:"shell_cmd": "cd "$file_path/.." && ruby "$file"" - 别依赖
__dir__或File.dirname(__FILE__)在构建系统里自动修正——它们在 Sublime 中生效,但前提是 Ruby 解释器本身已正确启动且环境变量就位
真正复杂的地方在于:Ruby 第三方库的加载链(ruby → gem → bundler → require)每一步都依赖前一步的环境完整性。Sublime 不参与其中任何一环,它只负责把命令交出去——所以出问题时,永远先问:这个命令在终端里、用完全相同的路径和环境变量,能不能跑通?不能,就不是 Sublime 的问题;能,再回头查构建系统的 shell_cmd 或 env 是否漏掉了关键变量。











