0

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

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

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

ruby extconf.rb
make

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

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

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

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

4

1 回答 1

1

我只是考虑将您的扩展打包为独立的 ruby​​gem。然后你可以将它添加到你的 Gemfile 中,让 rails 处理一切。与仅使用 ruby​​ 的 gem 相比,创建带有扩展名的 gem 有更多的内容,但本指南对它进行了很好的介绍。如果您想将 gem 保密,您应该查看本教程。除了 ruby​​gems.org 之外,您还必须修改 Gemfile 以在您的服务器上搜索元数据,或者您当前查看的任何位置。

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

于 2013-11-07T23:30:59.843 回答