全局Build System在Rails项目中失效,是因为不同项目可能使用不同Ruby版本、Gemset或自定义bin/ruby,而全局构建配置硬编码路径(如/opt/homebrew/bin/ruby)无法适配rbenv等版本管理器的动态shims机制;例如项目执行rbenv local 3.1.4后,全局构建仍调用系统或Homebrew Ruby,导致bundle exec不生效、require找不到本地Gem。

为什么全局Build System在Rails项目里会失效
因为不同项目可能用不同Ruby版本、不同Gemset或自定义bin/ruby,全局Ruby.sublime-build硬编码路径或shell命令无法适配。比如你用rbenv在项目根目录执行rbenv local 3.1.4,但全局构建系统仍调用/opt/homebrew/bin/ruby,导致bundle exec不生效、require找不到本地Gem。
如何用.sublime-project绑定项目专属Ruby路径
直接在项目根目录新建myapp.sublime-project,填入以下内容(以macOS + rbenv为例):
{
"folders": [
{
"path": "."
}
],
"settings": {
"tab_size": 2,
"translate_tabs_to_spaces": true
},
"build_systems": [
{
"name": "Ruby (project)",
"shell_cmd": "cd $project_path && ~/.rbenv/shims/ruby "$file"",
"file_regex": "^([^:]*):([0-9]+):?([0-9]+):? (.*)$",
"selector": "source.ruby",
"working_dir": "$project_path"
},
{
"name": "Rails Console",
"shell_cmd": "cd $project_path && bundle exec rails console",
"shell": true,
"working_dir": "$project_path"
}
]
}
关键点:
-
~/.rbenv/shims/ruby必须写绝对路径,~在JSON里不展开 -
shell_cmd里用cd $project_path && ...确保bundle和rails命令在项目上下文中执行 - Windows用户把
~/.rbenv/shims/ruby换成C:\Ruby32-x64\bin\ruby.exe,注意双反斜杠 - 不要用
cmd字段——它不支持&&链式命令,shell_cmd才支持
项目级环境变量怎么注入到构建过程
有些Gem(如mysql2)依赖PATH或LD_LIBRARY_PATH,全局PATH又污染其他项目。解决方案是直接在.sublime-project里加env字段:
"build_systems": [
{
"name": "Ruby (with MySQL)",
"shell_cmd": "cd $project_path && ~/.rbenv/shims/ruby "$file"",
"env": {
"PATH": "/usr/local/mysql/bin:$PATH",
"DYLD_LIBRARY_PATH": "/usr/local/mysql/lib"
},
"working_dir": "$project_path"
}
]
注意:
-
env只作用于该构建系统,不影响其他项目 - macOS上用
DYLD_LIBRARY_PATH,Linux用LD_LIBRARY_PATH - 路径中含空格(如
/Applications/Xcode.app/Contents/Developer/usr/bin)必须用引号包裹,否则JSON解析失败
为什么Ctrl+B运行后错误行点不跳转
不是插件问题,是file_regex没匹配Ruby实际报错格式。标准Ruby错误形如app/models/user.rb:12:in `save': undefined method `foo' (NoMethodError),但很多项目启用了bootsnap或zeitwerk,错误行会带额外括号或空格。
稳妥写法:
"file_regex": "^([^\s:]+):([0-9]+):?([0-9]+)?:?.*$"
解释:
-
^([^\s:]+)匹配文件名(不含空格和冒号,覆盖app/models/user.rb) -
:([0-9]+)匹配行号(允许后面跟:或空格) - 结尾
.*$吃掉剩余内容,避免因(NoMethodError)等干扰匹配 - 别用
^(*?):——*在正则里不转义会报错,必须写成[^\s:]
改完保存,重启Sublime,再试Ctrl+B,双击错误行就能准确定位了。


















