Ruby的专有C扩展

时间:2014-11-07 05:21:23

标签: c ruby bundler

我在C中编写了一些我希望从Ruby运行的专有业务逻辑。我试图把它写成一个gem,它只是Bundler从主项目内部的路径中包含的;但是,Bundler“在这种情况下不构建原生扩展”(#bundler irc频道中的tmoore)。

我宁愿不为此C扩展gem创建单独的私有存储库。我也不想为所有环境预编译本机版本。 RubyInline似乎不是一个选项,因为C不仅仅是几个函数,大量使用指向函数之间传递的结构的指针等。

是否有任何选项可以将C构建到项目中,以便通过标准捆绑安装在目标计算机上编译C?

1 个答案:

答案 0 :(得分:1)

感谢#bundler irc频道中的tmoore指向以下内容:

来自前者:

  

与git不同,bundler不会为指定的gem编译C扩展   作为路径。

从后者:

  

我想我会选择"如果需要,请使用git gems   编译扩展"。 :path,作为选项,是一种添加目录的方法   您手动管理到加载路径。如果你需要   在这些目录中构建的扩展,你应该自己做   作为手动管理该目录的一部分。 :)

这就是官方用语。如果您希望Bundler编译专有扩展,请从私有Git存储库加载扩展gem。 (这很有帮助:https://gist.github.com/masonforest/4048732。)为了避免过于宽泛的权限,您可以:

  1. 创建一个专用于您的私人回购的新Github帐户
  2. 授予其只读访问权限,只授予您的私人扩展回购
  3. 为该专用Github用户创建一个oauth令牌:https://help.github.com/articles/creating-an-access-token-for-command-line-use/
  4. 将oauthtoken合并到你的gemfile中的git url中:

    gem' your_gem_name',git:     ' https://your_oauth_token:x-oauth-basic@github.com/account/project.git'