我跑了bundle install
,令我惊讶的是,Rails 4附带的大多数宝石安装得很好。 byebug
是一个没有,但没什么大不了的。
究竟是什么让宝石与JRuby完全不兼容?
答案 0 :(得分:3)
在这种特殊情况下,gem被编写为YARV的C扩展,因此它只适用于YARV,而不适用于任何其他Ruby实现,包括但不限于JRuby,Rubinius,MagLev,MRuby,IronRuby等。
令人遗憾的是:据我所见,它只使用公共Ruby API,它实际上并没有使用YARV VM的任何私有内部信息,所以它也可以用便携式编写红宝石。
通常,有几个原因可以解释为什么gem只能在一个特定的Ruby实现上工作:
Hash
类是用Ruby编写的,并且与用Y编写的YARV Hash
类相似。 ) Rubinius和JRuby开发人员开发了一个FFI API,可用于以可在许多Ruby实现中移植的方式从Ruby获得C API。 Rubinius,JRuby,MacRuby和(我相信)MagLev原生支持FFI,而对于YARV,有一个宝石可以为它添加FFI支持。使用独立于实现的FFI API而不是YARV API的gem应该适用于几乎所有的实现。但是,FFI API并没有提供对实现内部的访问(显然),因此对于某些宝石来说它是不可用的。例如,有些宝石试图让您访问Proc
的源代码,这是高度特定于实现的(甚至可能无法工作,例如,当您提前编译到带有.class
的Java jrubyc
文件,源代码甚至不存在于运行时),因此每个Ruby实现都必须有不同版本的gem。