Как вы прекомпилируете нативные расширения для ruby ​​gem для linux? - PullRequest
13 голосов
/ 08 сентября 2010

У нас есть приложение ruby, которое зависит от драгоценного камня с нативными расширениями (в данном конкретном случае Nokogiri).Однако по разным причинам мы не можем установить предварительные требования для сборки (такие как build-essential, libxslt-dev, ruby-dev и т. Д.) Для этого драгоценного камня на нашем производственном хосте.

Есть ли (стандартный?) способ упаковать гем с предварительно встроенными собственными расширениями?

Это должно быть возможно (это кажется довольно стандартным для Windows), но я не могу найти никакой документациипо теме.

Обратите внимание, что нам нужно поддерживать только одну платформу с известными версиями всех системных библиотек (Ubuntu 9.04 Server 64 bit, Ruby 1.8.7).

ОБНОВЛЕНИЕ: Мымы используем Bundler, поэтому мы хотим, чтобы в конце дня у нас был gem для установки, , а не пакет debian .

Ответы [ 2 ]

21 голосов
/ 11 октября 2010

Наконец-то нашли способ сделать это для гемов, которые используют rake-compiler для построения своих расширений C (а это большинство из них).

Вам нужно сделать следующее накомпьютер, идентичный тому, на котором вы хотите развернуть, или он просто не будет работать:

Установите предварительные требования для сборки расширений C:

# apt-get install build-essentials ruby-dev # ... etc
# gem install rake-compiler

Распакуйте нужный вам гемдля восстановления:

$ gem unpack nokogiri

Создайте свой блестящий предварительно скомпилированный гем:

$ rake native gem

Теперь вы можете установить собственный гем на машину без каких-либо инструментов сборки:

$ gem install pkg/nokogiri-1.4.3.1-x86-linux.gem 
Successfully installed nokogiri-1.4.3.1-x86-linux
1 gem installed
0 голосов
/ 17 февраля 2014

Сборка машины

Чтобы иметь правильную платформенную версию для всех ваших драгоценных камней, уже кэшированных, упакуйте все драгоценные камни в vendor/cache на идентичной машине:

$ bundle package --all

Машина для производства

Установите все кэшированные зависимости gem, которые должны иметь правильно платформенная версия с использованием кеша драгоценных камней:

$ bundle install --local --deployment
...