2

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

最近我添加了一个恰好使用 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文件?)使用-Xcext.enabled=true标志。我不确定这是否可能,但我想我可以在我自己的机器上用 JRuby 尝试构建,并且仍然确保测试在 JRuby 中通过,也许在发布之前。

更新:根据http://about.travis-ci.org/docs/user/languages/ruby/,这是不可能的,特拉维斯政策因为在JRuby生产环境中可能存在问题

第二次更新:但是,请参阅已接受的答案,似乎 Travis 的政策可以被推翻。

2) 我不知道仅通过启用 C 扩展标志才能工作的支持代码是否被认为足够标准,以至于我可以声称我的库在 JRuby 中工作,即使我可以让它在 Travis 上构建。实际上,在我可以安排“适当”支持它之前,我最好放弃对 JRuby 的支持。还是我只是声明“在 JRuby 中工作 - 只要您启用 C 扩展”?

在我的 gem 中当前依赖的情况下,我可以找到一种解决方法。但是我可能会为 gem 本身添加一些 C 扩展(以通过一些重复的数学来提高性能),并且在可预见的将来也没有时间添加 Java 原生支持,主要是由于缺乏知识/技能爪哇。所以我想了解什么被认为是最佳实践——或者至少对 JRuby 用户来说什么是礼貌的——当 gem 具有 C 本机扩展但不是 Java 等效项时。

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

4

1 回答 1

2

看起来您可以使用 JRUBY_OPTS 环境变量将其传入,您可以通过将其添加到.travis.yml文件中来实现:

env:
  global:
    - "JRUBY_OPTS=-Xcext.enabled=true"
于 2013-06-16T20:31:53.083 回答