【问题标题】:How to add Ruby C Extension into Rails application?如何将 Ruby C 扩展添加到 Rails 应用程序中?
【发布时间】:2013-10-09 19:56:28
【问题描述】:

我有 Rails 4 应用程序。我用Ruby C API 创建了简单的C 扩展 此扩展从data 文件夹转换文件并根据该文件返回输出(some_file.f)

|-- data
|   |--some_file.f
|-- ext
|   `-- my_ext
|       |-- extconf.rb
|       |-- some_lib.c
|       `-- my_ext.c
|-- lib

现在,当我想使用该扩展时,我需要在 my_ext dir 中运行以下命令

ruby extconf.rb
make

然后我有额外的.o .bundle 编译文件。我还用require 'my_ext/my_ext'创建了初始化程序

  1. 我应该将这些文件移到哪里?转入lib/my_ext?

  2. 有没有办法改进编译过程并更好地组织编译文件? 将来我还想添加测试并在扩展编译后运行它们。 也许我应该从那个扩展创建一个 gem?还是 rake 任务?

  3. 我阅读了http://tenderlovemaking.com/2009/12/18/writing-ruby-c-extensions-part-1.html 这个教程,但是如何在 Rails 应用程序中实现它?将 Rakefile 放在哪里?

【问题讨论】:

  • 您可以使用rake-compiler gem 添加一个 rake 任务,并传递一些详细信息,以便它知道在哪里可以找到 extconf,以及在完成后将扩展名放在哪里。不确定项目的具体设置是什么,而不是 gem,因此不是完整的答案,但你想要的绝对是可能的。
  • 但是将 rake-compiler 文档中的 Rakefile 放在 rails 应用程序的哪里?

标签: ruby-on-rails c ruby ruby-c-extension


【解决方案1】:

我只是想把你的扩展打包成一个独立的 ruby​​gem。然后你可以将它添加到你的 Gemfile 中,让 rails 处理一切。与仅使用 ruby​​ 的 gem 相比,创建带有扩展名的 gem 有更多的内容,但 this guide 很好地解决了这个问题。如果您想将 gem 保密,您应该查看 this tutorial。除了 ruby​​gems.org 之外,您还必须修改您的 Gemfile 以在您的服务器上搜索元数据,或者您当前查看的任何位置。

如果您开始尝试自己手动管理扩展,您可能会遇到很多问题,例如需要使用配置选项 --enable-shared 设置的 ruby​​ 构建(允许您使用一个基本的 require 语句)或必须重新启动整个 rails 应用程序才能查看 lib/ 目录中的任何更改(假设这是您手动放置扩展的位置)。过去我被这两个咬过,从那以后我转而为这种类型的东西创建私有 gem,因为 gem 安装过程非常简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2017-06-14
    相关资源
    最近更新 更多