asdf-vm使用旧版runtime时能否调用新版runtime关联的全局包
跨Ruby版本调用全局Gems问题解答
你当前的~/.default-gems配置内容如下:
gem-ctags dip bundler gem-browse pry pry-byebug pry-doc pry-theme rubocop rubocop-performance rubocop-rake rubygems-update ruby-debug-ide ruby_parser seeing_is_believing solargraph sqlint
旧版Runtime能否调用Ruby 3.2.0-dev关联的Gems
直接调用是行不通的。RubyGems的安装路径和Ruby ABI版本是强绑定关系,不同主/次版本(包括开发预览版)的Ruby会使用完全独立的gem存储目录,默认情况下跨版本不会互相扫描对方的gem加载路径。
就算手动修改$LOAD_PATH强行把3.2.0-dev的gem路径加到旧版Ruby的加载列表里,也必然出兼容性问题:
- 带C原生扩展的gem会直接抛出ABI不匹配错误,完全加载失败,你列表里的
pry-byebug、ruby-debug-ide、solargraph、gem-ctags都属于这类。 - 纯Ruby实现的gem也会踩语法、标准库兼容坑:Ruby 3.2新增的语法、调整的标准库接口旧版本根本识别不了,而且不少gem本身就对运行的Ruby最低版本有明确要求(比如高版本RuboCop已经不再支持Ruby 2.6及以下版本),强行跨版本跑会出现语法报错、方法缺失等异常。
旧版Runtime下的冗余Gem能否安全卸载
分情况操作就不会出问题:
- 可以放心卸载的:如果你不会在旧版Ruby环境下用对应工具,旧版环境里装的
pry系列调试工具、rubocop系列代码检查工具、solargraph、sqlint这类开发类全局gem直接卸就行。项目依赖的gem是Bundler独立管理的,存放在项目专属路径或者Bundler配置的独立目录下,和全局gem完全隔离,卸载全局工具gem不会破坏任何项目的正常运行。 - 别乱卸的:旧版Ruby对应的基础依赖gem,比如匹配旧版Ruby版本的
bundler、rubygems-update,卸了之后旧版环境下的bundle命令会直接失效,安装gem也容易出异常。
要是嫌每个Ruby版本都要重复装一遍全局gem麻烦,给你用的Ruby版本管理器(rbenv/rvm/asdf这类都支持)配上default-gems规则就行,之后装任意新版本Ruby的时候,工具会自动按你列的清单装好全局gem,不用手动挨个敲安装命令。
内容的提问来源于stack exchange,提问作者Ezequiel Birman
相关产品推荐
相关产品推荐

