在分叉这个 Heroku buildpack(对于 phantomjs,但我想这个问题适用于其他自定义 buildpack)之后:
https://github.com/stomita/heroku-buildpack-phantomjs
并更新编译脚本以从自定义 phantomjs tar.bz2 文件中提取,该文件的 bin/phantomjs 二进制文件已替换为以下文件:
http://arunoda.me/blog/phantomjs-webfonts-build.html
Heroku 构建过程正常工作,提取正确的修改后的二进制文件,但是在将其栅格化网页时,会出现错误消息(通过 heroku 日志,为了简洁而没有时间戳):
app[web.1]: phantomjs: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by phantomjs)
app[web.1]: phantomjs: /lib/libc.so.6: version `GLIBC_2.15' not found (required by phantomjs)
app[web.1]: phantomjs: /lib/libc.so.6: version `GLIBC_2.14' not found (required by phantomjs)
我试过简单地将这些文件包含在各种配置中的 tar.bz2 文件中(在不同的 /lib 或 /usr/lib 位置),但这没有奏效。我意识到有可能必须向 buildpack 中的编译脚本添加一些额外的路径信息,但也许是因为我不是一个 Ops 人员,所以我不太明白。加上对 buildpacks 的研究,以及引用基本 /app 目录的人以及具有供应商的编译脚本,我更加困惑。
我认为这是可以解决的:事实上,Deepsy似乎已经通过说明“然后我从 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 复制 libstdc++.so.6 并添加它到我的自定义 buildpack 中,现在它可以完美运行 :)”
就像这篇文章的大部分内容所指出的那样,对我来说,问题是我不知道那一行意味着什么,并且非常感谢任何帮助。我在这上面花了太多时间,真的被困住了。
提前致谢。
更新1:
我在他的 github repo 中找到了Deepsy 的代码,并尝试使用相同的 curl 方法,还更新了 LD_LIBRARY_PATH 变量和 chmod 777ing 文件夹的内容(包括二进制文件和库文件)。这不起作用(出现相同的错误消息)。此外,我的二进制文件需要 libc.so.6,而他没有,但我从我的操作系统中获得了该文件。
也很有趣:当尝试将 libc.so.6 库文件添加并 mv 到 LD_LIBRARY_PATH 时,我的 Heroku 应用程序崩溃了。我怀疑这可能是将该库添加到 LD_LIBRARY_PATH 可能会混淆 Heroku 中的其他二进制文件并使用我的版本,无论出于何种原因,该版本不适用于 Heroku 实例。
更新 2:
我还尝试从头开始构建 phantomjs 二进制文件并成功。结果我从顶部的第二个链接获得了完全相同大小的二进制文件,并且对必需库的调用相同(因此错误相同)。
当前论文:
可能是 phantomjs 二进制文件在更新 1 中看到了正确的 lib 文件,但提供的 Heroku 文件的最新版本不足以使二进制文件正确运行。或者它仍然可能缺少库文件。
无论哪种方式,我想我都需要以某种方式让 phantomjs 使用我提供的库文件,但我不知道该怎么做。