Могу ли я включить системные библиотеки (например, libxml2), с которыми я компилирую, в гем (например, nokogiri), который я могу развернуть в Heroku? - PullRequest
7 голосов
/ 22 декабря 2011

У Nokogiri есть проблема с переводом символов в UTF-8 и обратно, которые происходят из libxml2, а именно из версии 2.7.6, которая является самой высокой поддерживаемой версией в Ubuntu 10.04 LTS. Ошибка исправлена ​​в версии 2.7.7 и выше, но поскольку наше приложение размещено на Heroku (стек бамбука-ree-1.8.7, основанный на Ubuntu 10.04), мы должны использовать версию 2.7.6 и продолжать испытывать ошибка, если:

  1. Кто-то может / взломал нокигири, чтобы обойти проблему
  2. Canonical поднимает поддерживаемую версию libxml2 для Ubuntu 10.04 (и / или Heroku обновляет libxml2 в своем стеке)
  3. Я могу предложить nokogiri способ использования версии libxml2, которую я могу связать с приложением таким образом, чтобы его можно было развернуть в Heroku.

Рад слышать любые отзывы о 1 или 2, конечно, но любопытно, возможно ли 3. Вот то, что я знаю, чтобы быть возможным:

  • Нокогири можно связать с библиотекой, расположенной в нестандартном месте - http://nokogiri.org/tutorials/installing_nokogiri.html
  • Созданный таким образом драгоценный камень может быть установлен вендору / драгоценным камням и, таким образом, имеет приоритет над системными драгоценными камнями

У меня вопрос: могу ли я включить в приложение более высокую версию libxml2 таким образом, чтобы скомпилированный гем от вендора использовал его, когда я его зафиксировал и отправил в Heroku?

Ответы [ 3 ]

4 голосов
/ 25 декабря 2011

Это не самое удобное решение, но вот что я однажды сделал, чтобы получить пользовательскую версию libpq.Я сделал это на кедре, но он, вероятно, сработает для бамбука, если вы сначала войдете в tmp

  1. heroku run bash
  2. curl источник того, что вы хотите построить
  3. build it
  4. отправка двоичных файлов из dyno
  5. поставщик встроенных двоичных файлов в vendor / любой другой конфигурации
  6. heroku: добавьте LD_LIBRARY_PATH = / app / vendor / любой другой

Извините, пока нет лучшего способа получить кастомные бинары.Удачи.

1 голос
/ 22 декабря 2011

Я не уверен в точном ответе, но я нашел проблему, поднятую для Нокогири, которая звучит как проблема, которую вы только что описали: https://github.com/tenderlove/nokogiri/issues/458

В одном из ответов рассказывается о том, как они размещены на Heroku и заблокированы для версии 2.7.6 libxml2, и просили их обновить версию до 2.7.8, чтобы решить их проблему: https://github.com/tenderlove/nokogiri/issues/458#issuecomment-2600583

Хотя маловероятно, возможно, стоит связаться с Heroku, чтобы узнать, что они могут сделать (если что-нибудь), или, возможно, у них есть какие-либо предложения? Я рискнул бы предположить, что они не изменят версию libxml2, поскольку она находится в заблокированном стеке (Bamboo), но кто знает?

0 голосов
/ 16 ноября 2014

У меня есть немного лучшее решение. Чем больше я играю с беседкой, тем больше она мне нравится. Bower - это просто инструмент, созданный на основе git, который причудливо структурирует вещи (обычно нацелен на сценарии JS для внешнего интерфейса / не является обязательным требованием). Еще одно замечание: bower отлично подходит как для установки частных зависимостей, так и вне github.

Примером является python, но общая цель та же и может быть скорректирована для ruby.

Итак, возьмем этот проект для примера 3scale_python .

Требуется установить libxml2 (через файл needs.txt). Самым простым способом для меня было включить его в bower, а затем написать скрипт для его установки (shell script и procfile).

bower.json

{ "name": "someapp", "version": "0.0.1", "homepage": "http://github.com/yourusername/yourrepo", "authors": [nem], "description": "something that uses 3scale at a specific commit", "main": "./lib/clock.py", "private": true, "dependencies": { "3scale_ws_api_for_python": "http://github.com/3scale/3scale_ws_api_for_python/archive/82328aa8e7d43f7ef89e420921a4d63e025b527f.zip" } }

скрипт установки (manual_installs_python)

#!/bin/bash
set -e

oldPath=$(pwd)

installing(){
  echo "-- installing $1 dependencies --"
  echo '--------------------------------'
  echo
}

#check for brew, if brew then use it to install something
osx_brew() {
    #if brew is installed (no error)
    if hash brew 2 > /dev/null; then
      installing 'brew'
      brew "$@"
    fi
}

installing 'python easy_install'
easy_install figleaf

cd ./bower_components/some_other_python_app
python setup.py install

if [[ $IS_HEROKU = 1 ]]; then
  #installing on ubuntu/heroku only as, so far I have not gotten libxml2-python to install successfully on OSX
  cd ../3scale_ws_api_for_python
  #requirements.txt here actually installs and compiles libxml2
  pip install -r requirements.txt
  python setup.py install
fi

cd "$oldPath"

echo "-- done with dependencies -- "
exit 0

PROCFILE

web: pip install -r requirements.txt && ./scripts/manual_python_installs

Готово

Слишком инсталлируйте libxml2, возможно, вы захотите ознакомиться со сценариями, которые запускает 3scale через его needs.txt.

...