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,除非:
- 有人可以/已经黑掉nokogiri来解决这个问题 Canonical提升了Ubuntu 10.04支持的libxml2版本(和/或Heroku在他们的堆栈中更新了libxml2)
- 我可以想出一个方法,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
- curl指定要构建的源代码
- 将二进制文件发送到动态文件
- vendor/whatever
- 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.