2013-10-09 2 views
-1

У меня есть Rails 4 приложение. Я создал простое расширение C с Ruby C API Это расширение преобразования файлов из data папки и возвращает выходной сигнал, основанный на этом файле (some_file.f)Как добавить расширение Ruby C в Rails?

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

Прямо сейчас, когда я хочу использовать это расширение мне нужно запустить следующие команды в my_ext директории

ruby extconf.rb 
make 

Тогда у меня есть дополнительные .o.bundle ВЫПОЛНИВШИЕ файлы. Я также создал инициализатор с require 'my_ext/my_ext'

  1. Где я должен перемещать эти файлы? В lib/my_ext?

  2. Есть ли способ улучшить этот процесс компиляции и лучше организовать соответствующие файлы? В будущем я хотел бы также добавить тесты и запустить их после компиляции с расширением. Может быть, я должен создать камень из этого расширения? Или рейк-задача?

  3. Я читал http://tenderlovemaking.com/2009/12/18/writing-ruby-c-extensions-part-1.html этот учебник, но как реализовать это в приложении Rails? Где поставить Rakefile?

+0

Вы можете добавить задачу грабли с помощью графа 'rake-compiler', передав ему несколько деталей, чтобы он знал, где найти extconf, и куда поместить расширение, когда это будет сделано. Не уверен, что настройки для проекта в отличие от драгоценного камня, следовательно, не полный ответ, но то, что вы хотите, безусловно, возможно. –

+0

Но где положить Rakefile из rake-компилятора в приложение rails? – tomekfranek

ответ

1

Я бы просто посмотрел на упаковку вашего расширения как самостоятельного рубигема. Затем вы можете добавить его в свой Gemfile и просто позволить рельсам обрабатывать все. Есть немного больше, чтобы создать драгоценный камень с расширением, чем драгоценный камень с только рубином, но this guide хорошо справляется с этим. Если вы хотите сохранить частный драгоценный камень, вы должны проверить this tutorial. Вам также придется изменить свой Gemfile для поиска метаданных на вашем сервере в дополнение к rubygems.org или везде, где вы сейчас смотрите.

Если вы начинаете пытаться вручную управлять добавлением самостоятельно, вы можете столкнуться с довольно многими ситуациями, такими как необходимость создания Ruby с параметром конфигурации --enable-shared set (для того, чтобы вы могли ссылаться на общий объект с базовым требованием) или перезапустить все приложение rails, чтобы увидеть какие-либо изменения в каталоге lib/(предполагая, что вы вручную разместили расширение). Я был укушен этими двумя в прошлом и с тех пор перешел на создание частных драгоценных камней для этого типа вещей, потому что процесс установки драгоценных камней настолько прост.