如何测试和记录JRuby兼容性,对于带有一些C ext的gem

如何测试和记录JRuby兼容性,对于带有一些C ext的gem,ruby,gem,jruby,travis-ci,Ruby,Gem,Jruby,Travis Ci,我创建了一个简单的已发布gem,源代码在github上管理,提交时它在travisci上运行构建 最近我添加了一个依赖项,它恰好使用了C扩展。我在JRuby上的构建失败,Travis报告了以下消息: Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /home/travis/.rvm/rubies/jruby-1.7.3-d18/bin/jruby extconf.rb N

我创建了一个简单的已发布gem,源代码在github上管理,提交时它在travisci上运行构建

最近我添加了一个依赖项,它恰好使用了C扩展。我在JRuby上的构建失败,Travis报告了以下消息:

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
    /home/travis/.rvm/rubies/jruby-1.7.3-d18/bin/jruby extconf.rb 
NotImplementedError: C extension support is not enabled. Pass -Xcext.enabled=true to JRuby or set JRUBY_OPTS or modify .jrubyrc to enable.
   (root) at /home/travis/.rvm/rubies/jruby-1.7.3-d18/lib/ruby/shared/mkmf.rb:8
  require at org/jruby/RubyKernel.java:1019
   (root) at extconf.rb:1
我这里有两个相关问题:

1) 我不知道如何告诉travis(大概是通过
.travis.yml
文件?)使用
-xtext.enabled=true
标志。我不确定这是否可行,但我想我可以在JRuby中在自己的机器上尝试构建,并确保测试在JRuby中通过,可能在发布之前

更新:这是不可能直接实现的,Travis策略是因为根据

第二个更新:然而,见公认的答案,似乎特拉维斯的政策可以被滥用

2) 我不知道只通过启用C扩展标志才能工作的支持代码是否被认为是足够标准的,我可以声称我的库在JRuby中工作,即使我可以让它在Travis上构建。事实上,我最好放弃对JRuby的支持,直到我能够“适当地”支持它。或者我只是声明“在JRuby中工作-只要启用C扩展”

就我的gem中当前的依赖性而言,我可以找到一个解决方法。然而,我可能会向gem本身添加一些C扩展(通过反复计算来提高性能),并且在可预见的将来也没有时间添加Java本机支持,这主要是因为缺乏Java方面的知识/技能。因此,我想了解当gem有C本机扩展但没有Java等效扩展时,什么是最佳实践,或者至少对JRuby用户来说什么是礼貌的


当我搜索Travis中的错误消息时,我没有找到任何建议的修复方法。当我签入Stack Overflow时,我看到JRuby用户在试图让特定的本机扩展gem在他们的系统上工作时提出了很多问题。

看起来您可以将其与JRuby_OPTS环境变量一起传递,您可以通过将其添加到
.travis.yml
文件中来实现:

env:
  global:
    - "JRUBY_OPTS=-Xcext.enabled=true"

谢谢,成功了。我可以再次使用JRuby自动化测试。我仍然不确定我应该在宣称JRuby兼容性方面走多远,但我最好的猜测是“事实”,即测试通过JRuby并启用扩展。我对JRuby社区不太熟悉,所以我不知道在什么情况下库可以正确地宣称“兼容”,但至少在某些情况下可以使用JRuby。