sublime text 本身不运行 ruby 测试,仅传递命令;报“command not found: rspec”主因是 gui 启动时未加载 shell 环境变量(如 ~/.zshrc 或 rvm 初始化),导致找不到 rspec 或 bundle,需通过 zsh -l -c 完整初始化 shell 并指定 working_dir 为项目根路径确保 bundle exec 正确执行。

Sublime Text 本身不运行 Ruby 测试,它只负责把 ruby 命令或 bundle exec rspec 这类命令正确传给系统;能否跑通测试,取决于你本地是否装了 rspec、minitest 或其他测试框架,以及 Sublime 能否在自己的进程环境里找到它们——这和配置普通 Ruby 构建系统是同一类问题,但测试场景有额外约束。
为什么 Ctrl+B 运行 test 文件总报 “command not found: rspec”
不是没装 rspec,而是 Sublime GUI 启动时看不到你的 shell 环境变量(比如 ~/.zshrc 或 rvm 初始化逻辑),所以连 bundle 都找不到。验证方法:按 Ctrl+` 打开控制台,输入 import os; print(os.environ.get('PATH')),看输出里有没有 /Users/xxx/.rbenv/shims 或 /opt/homebrew/bin(macOS)或 C:Ruby32-x64in(Windows)。没有就说明环境根本没加载,后续所有测试命令都会失败。
如何写一个能跑 rspec 或 minitest 的构建系统
关键不是换命令名,而是确保 shell 初始化完整、路径可访问、且支持项目级依赖(如 bundle exec)。不要裸写 "shell_cmd": "rspec $file",GUI 下基本必挂。
- macOS/Linux(用 rbenv):
"shell_cmd": "zsh -l -c 'cd "$project_path" && bundle exec rspec "$file"'"——-l加载~/.zshrc,cd切到项目根保证Gemfile可见 - macOS/Linux(用 rvm):
"shell_cmd": "zsh -l -c 'cd "$project_path" && rvm use $(cat .ruby-version 2>/dev/null || echo "default") && bundle exec rspec "$file"'" - Windows:
"cmd": ["C:\Ruby32-x64\bin\ruby.exe", "-S", "rspec", "$file"]—— 注意双反斜杠,且需确认rspecgem 已全局安装(gem install rspec);若依赖bundle,改用cmd调用bundle.bat并指定完整路径 - 通用 fallback(绕过 bundle):
"shell_cmd": "zsh -l -c 'cd "$project_path" && ruby -Ilib:test -r./test/test_helper.rb "$file"'"—— 适用于minitest,手动补-I和-r
file_regex 必须匹配实际测试错误格式
rspec 默认错误输出是 ./spec/models/user_spec.rb:12:in `block (3 levels) in <top>': expected ... (RSpec::Expectations::ExpectationNotMetError)</top>,而 minitest 是 test/models/user_test.rb:8:in `test_something'。如果 file_regex 不匹配,双击错误行就跳不到对应位置。
- 适配 rspec:
"file_regex": "^\./([^:]*?):([0-9]+):" - 适配 minitest:
"file_regex": "^([^:]*?):([0-9]+):in `test_.*' - 最宽泛兜底(推荐先用):
"file_regex": "^([^:]*?):([0-9]+):"—— 要求错误行以文件名:行号:开头,覆盖绝大多数情况
测试文件不会自动保存,改完代码必须先 Ctrl+S
Sublime 构建系统默认不触发保存动作,这意味着你修改了 spec/ 下的测试或 app/ 下的被测代码,但没手动保存,执行的仍是磁盘上旧版本。尤其在快速迭代时,容易误判“测试没生效”。没有插件能 100% 可靠拦截并强制保存所有相关文件,所以养成 Ctrl+S 后再 Ctrl+B 的习惯是最直接的解法。
真正容易被忽略的是:测试命令是否在正确的目录下执行。如果你的 Gemfile 不在 $project_path(比如项目根是 myapp/,但 Sublime 打开的是 myapp/app/),bundle exec 就会找不到 Gemfile。务必用 "working_dir": "$project_path" 显式指定工作目录,而不是依赖当前文件路径。











