Как вы прекомпилируете нативные расширения для гема ruby для linux?
У нас есть приложение ruby, которое зависит от гема с нативными расширениями (в данном конкретном случае Nokogiri). Однако по разным причинам мы не можем установить предварительные требования для сборки (такие как build-essential, libxslt-dev, ruby-dev и т. Д.) Для этого гема на наш рабочий хост.
Есть ли (стандартный?) Способ переупаковки драгоценного камня с предварительно встроенными встроенными расширениями?
Это должно быть возможно (кажется, это довольно стандартно для Windows), но я не могу найти никакой документации по этому вопросу.
Обратите внимание, что нам нужно поддерживать только одну платформу с известными версиями всех системных библиотек (Ubuntu 9.04 Server 64 bit, Ruby 1.8.7).
ОБНОВЛЕНИЕ: Мы используем Bundler, поэтому мы хотим, чтобы в конце дня у нас по-прежнему был установлен гем, а не пакет Debian.
2 ответа
Наконец-то нашел способ сделать это для гемов, которые используют rake-компилятор для сборки своих расширений Си (а это большинство из них).
Вам нужно сделать следующее на машине, которая идентична той, на которой вы хотите развернуть, или она просто не будет работать:
Установите предварительные требования для сборки расширений 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
Сборка машины
Чтобы иметь правильную платформенную версию для всех ваших драгоценных камней, уже кэшированных, упакуйте все драгоценные камни в vendor/cache
на идентичной машине:
$ bundle package --all
Машина производства
Установите все кэшированные зависимости gem, которые требуют правильной платформы с использованием кэша gem:
$ bundle install --local --deployment