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



Nokogiri在转换UTF-8字符时存在问题,该字符来自libxml2,特别是2.7.6版本,这是Ubuntu 10.04 LTS上支持的最高版本。这个bug在2.7.7及更高版本中修复了,但由于我们的应用程序托管在Heroku (bamboo- tree -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可以安装到vendor/gems中,因此优先于系统gem

我的问题是,我可以包括更高版本的libxml2与应用程序在这样一种方式,编译,供应商的gem使用它时,我已经提交了它,并把它推到Heroku?

这不是最用户友好的解决方案,但我曾经这样做过,以获得libpq的自定义版本。我在雪松上做过,但如果你先进入tmp

,它可能对竹子也有效。
    heroku run bash
  1. curl指定要构建的源代码
  2. 将二进制文件发送到动态文件
  3. vendor/whatever
  4. heroku config:add LD_LIBRARY_PATH=/app/vendor/whatever

对不起,还没有更好的方法来获得自定义二进制文件。好运。

我不确定确切的答案,但我发现了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版本,因为它是在一个锁定的堆栈(竹),但谁知道呢?

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

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

以这个项目为例3scale_python

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

install script (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.

相关内容

最新更新