我可以将系统库(例如libxml2)编译成一个我可以部署到Heroku的gem(例如nokogiri)吗?

时间:2011-12-22 02:52:38

标签: ruby-on-rails heroku nokogiri ubuntu-10.04 libxml2

Nokogiri在转换为UTF-8字符时出现问题,后者最终来自libxml2,特别是版本2.7.6,这是Ubuntu 10.04 LTS上支持的最高版本。该错误已在2.7.7及更高版本中修复,但由于我们的应用程序托管在Heroku(bamboo-ree-1.8.7堆栈,基于Ubuntu 10.04)上,我们必须使用2.7.6版本,并继续体验错误,除非:

  1. 有人可以/已经攻击了nokogiri以解决问题
  2. Canonical颠覆了Ubuntu 10.04支持的libxml2版本(和/或Heroku更新了堆栈中的libxml2)
  3. 我可以想办法让nokogiri使用libxml2版本,我可以将它与应用程序捆绑在一起,以便可以部署到Heroku。
  4. 很高兴听到有关1或2的任何反馈,但很好奇3是否可行。以下是我所知道的可能:

    我的问题是,我是否可以将更高版本的libxml2包含在应用程序中,以便在我提交并将其推送到Heroku时,已编译的供应商宝石使用它?

3 个答案:

答案 0 :(得分:4)

这不是最用户友好的解决方案,但这是我曾经做过的一次获得自定义版本的libpq。我是在雪松上做过的,但是如果你先进入tmp,它可能适用于竹子。

  1. heroku run bash
  2. 卷曲您要构建的内容的来源
  3. 构建它
  4. 将二进制文件发送出dyno
  5. 在vendor / whatever
  6. 中提供构建的二进制文件
  7. heroku config:添加LD_LIBRARY_PATH = / app / vendor / whatever
  8. 抱歉没有更好的方法来获得定制binaires。祝你好运。

答案 1 :(得分:1)

我不确定确切的答案,但我发现Nokogiri的问题听起来像你刚刚描述的问题:https://github.com/tenderlove/nokogiri/issues/458

其中一个回复讨论了它们如何在Heroku上托管并被锁定到libxml2的2.7.6版本并且已经请求将其升级到2.7.8来解决它们的问题:https://github.com/tenderlove/nokogiri/issues/458#issuecomment-2600583

虽然不太可能,但是可能值得联系Heroku看看他们可以做什么(如果有的话),或者他们是否可能有任何建议?我会冒险猜测他们不会改变libxml2版本,因为它在一个锁定的堆栈(Bamboo)上但谁知道?

答案 2 :(得分:0)

我有一个更好的解决方案。我越喜欢凉亭,我就越喜欢它。 Bower只是一个构建在git之上的工具,以一种奇特的方式构建东西(通常针对前端JS脚本/不是必需的)。另外还有一个注意事项,bower非常适合安装私有依赖项以及github。

示例是python,但总体目标是相同的,可以针对ruby进行调整。

所以请以此项目为例3scale_python

它需要安装libxml2(通过其requirements.txt)。对我来说最简单的方法是将它包含在bower中,然后编写一个脚本来安装它(shell脚本和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通过它的requirements.txt触发。