【发布时间】:2015-10-31 16:41:16
【问题描述】:
我运行了bundle install,令我惊讶的是,大多数随 Rails 4 一起提供的 gem 都安装得很好。 byebug 没有,但没什么大不了的。
究竟是什么让 gem 与 JRuby 不兼容?
【问题讨论】:
我运行了bundle install,令我惊讶的是,大多数随 Rails 4 一起提供的 gem 都安装得很好。 byebug 没有,但没什么大不了的。
究竟是什么让 gem 与 JRuby 不兼容?
【问题讨论】:
在这种特殊情况下,gem 是作为 YARV 的 C 扩展编写的,因此它仅适用于 YARV,不适用于任何其他 Ruby 实现,包括但不限于 JRuby、Rubinius、MagLev、MRuby、IronRuby 等.
可悲的是:据我所知,它只使用公共 Ruby API,实际上并没有使用 YARV VM 的任何私有内部信息,所以它也可以用可移植的 Ruby 编写。
一般来说,一个 gem 可能只在一个特定的 Ruby 实现上工作有几个原因:
Hash 类是用 Ruby 编写的,其性能与 YARV 用 C 编写的 Hash 类相当。)Rubinius 和 JRuby 开发人员开发了一个 FFI API,可用于使 C API 从 Ruby 中可用,这种方式可以在许多 Ruby 实现中移植。 Rubinius、JRuby、MacRuby 和(我相信)MagLev 原生支持 FFI,对于 YARV,有一个 gem 为其添加了 FFI 支持。使用独立于实现的 FFI API 而不是 YARV API 的 Gem 应该适用于几乎所有的实现。但是,FFI API 不提供对实现内部的访问权限(显然),因此对于某些 gem 来说它是不可用的。例如,有些 gem 试图让您访问 Proc 的源代码,这是高度特定于实现的(甚至可能不起作用,例如,当您提前编译为 Java .class 文件时使用jrubyc,源代码甚至在运行时都不存在),因此每个 Ruby 实现都必须有该 gem 的不同版本。
【讨论】: