我的应用程序需要包man
,但默认情况下它不会安装在heroku / nodejs buildpack上。
因此,根据the documentation,当您的应用需要其他相关依赖项时,heroku/heroku-buildpack-apt是工作的工具。
我分配了新的buildpack,并在项目的根目录中添加了Aptfile
一行:
man
这是我的完整包.json
{
"name": "unix-translator",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"test": "mocha --exit"
},
"dependencies": {
"body-parser": "~1.18.2",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.15.5",
"jade": "~1.11.0",
"morgan": "~1.9.0",
"node-dev": "^3.1.3",
"serve-favicon": "~2.4.5",
"dateTools": "file:lib/unix-command"
},
"devDependencies": {
"chai": "^4.1.2",
"mocha": "^4.1.0"
}
}
这是我的Procfile:
web: node ./bin/www
这会成功安装依赖项,因为我现在运行which man
时会看到它。但它不起作用。
当我尝试使用 man
程序时出现此错误:
~ $ man cat
man: error while loading shared libraries: libmandb-2.7.5.so: cannot open shared object file: No such file or directory
我确实找到了this blog post和this other blog post,它们都提出了与权限和文件位置相关的问题...我已连接到我的dyno并运行:/sbin/ldconfig -v
并最终抛出这个错误:
/sbin/ldconfig.real: Can't create temporary cache file /etc/ld.so.cache~: Read-only file system
^该命令需要与sudo
一起运行,并且在dyno中不可用。 :-(
所以我再次陷入困境。
答案 0 :(得分:0)
不是100%肯定,但这可能值得一试: 用heroku-prebuild(或heroku-postbuild)替换package.json中的“prestart”,如下所示:
"scripts": {
"start": "node ./bin/www",
"test": "mocha --exit",
"heroku-prebuild": "apt-get update && apt-get install man"
},
你在“prestart”中有这个,这意味着你在运行npm start时会执行它。 但是,根据您的问题,您似乎正在访问one-off Heroku dyno(例如使用“heroku run bash”),然后尝试在其中运行“man cat”。因此,当你这样做时,你的dyno上根本没有运行“npm start”。 通过将“apt-get”放在Heroku specific build steps中的一个中,它会在slug构建时执行,因此您应用的任何dyno都应该可以使用您安装的任何内容(包括一次性dynos) )。