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

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版本,并继续体验bug,除非:

  1. 有人可以/已经攻击了nokogiri以解决问题
  2. Canonical颠覆了Ubuntu 10.04支持的libxml2版本(和/或Heroku更新了堆栈中的libxml2)
  3. 我可以想出一种方法让nokogiri使用libxml2版本,我可以将其与应用程序捆绑在一起,以便可以部署到Heroku。

很高兴听到有关1或2的任何反馈,但很好奇3是否可行。 以下是我所知道的可能性:

  • Nokogiri可以链接到位于非标准位置的图书馆 – http://nokogiri.org/tutorials/installing_nokogiri.html
  • 以这种方式创建的gem可以安装到供应商/gem,因此优先于系统gem

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

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

  1. heroku运行bash
  2. curl你想要建立的东西的来源
  3. 建立它
  4. 将二进制文件从dyno中发送出去
  5. 供应商在供应商/无论如何建立二进制文件
  6. heroku config:添加LD_LIBRARY_PATH = / app / vendor / whatever

对不起,还没有更好的方法来获得定制的binaires。 祝好运。

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

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

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

我有一个稍好的解决方案。 我玩凉亭越多,我就越喜欢它。 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触发。