问题
我的问题就像如何安装 Python Heroku 项目的内部要求? https://stackoverflow.com/q/9112784/1286628 and 如何在部署时在Heroku中自定义pip的requirements.txt? https://stackoverflow.com/q/16876816/1286628。即,我有一个私人存储库,需要将 Python 依赖项安装到我的 Heroku 应用程序中. The 规范答案 https://stackoverflow.com/a/9136665/1286628,由 Heroku 自己给出肯尼思·赖茨 https://stackoverflow.com/users/120004/kenneth-reitz,就是把类似的东西
-e git+https://username:pas[email protected] /cdn-cgi/l/email-protection/kennethreitz/[email protected] /cdn-cgi/l/email-protection#egg=requests
in your requirements.txt
file.
我的安全需要阻止我将密码存储在存储库中。(我也不想将依赖项放入我的应用程序的存储库中;它们是单独的软件,需要位于单独的存储库中。)我可以提供密码的唯一位置(或者最好是 GitHub OAuth 令牌或部署) key) 到 Heroku,位于像这样的环境变量中
heroku config:add GITHUB_OAUTH_TOKEN=12312312312313
尝试的解决方案
我可以使用自定义.profile
在我的应用程序的存储库中,但随后我将下载并安装我的依赖项每一次进程(web、worker 等)重新启动。
这就需要使用自定义构建包和Heroku 实验室插件 https://devcenter.heroku.com/articles/labs-user-env-compile这暴露了我的heroku config
buildpack 编译之前的环境。我试过建设一号 https://github.com/EconomistsInc/heroku-buildpack-tvrweb-private-deps在之上多构建包 https://github.com/ddollar/heroku-buildpack-multi。这个想法是 Buildpack Multi 是主要的构建包,并使用.buildpacks
当我在我的应用程序存储库中添加一个文件时,它首先下载正常的 Heroku Python 构建包,然后下载我的自定义构建包。
问题是,即使在 Buildpack Multi 成功运行 Python buildpack 之后,Python 二进制文件和 Pip 包不可见 https://github.com/EconomistsInc/heroku-buildpack-tvrweb-private-deps/blob/master/bin/detect#L18一旦 Buildpack Multi 运行,就添加到我的 buildpack。所以自定义构建包彻底失败了。 (在我的测试中,GITHUB_OAUTH_TOKEN
环境变量已正确暴露给构建包。)
我唯一能想到尝试的另一件事是制作我自己的 Python 构建包的分支,当它安装来自的所有内容时,它会安装我的依赖项requirements.txt
,甚至重写requirements.txt
直接地。这两个看起来确实像heavy我认为是一个非常常见的问题的解决方案。
更新:当前解决方法
我的自定义构建包(上面链接)现在下载并将我的闭源依赖项(“foo”)保存到 geos 构建包使用的供应商目录中。我将 foo 本身对我的应用程序的依赖项提交到我的应用程序中requirements.txt
。因此 Pip 通过我的应用程序安装 foo 的依赖项requirements.txt
并且构建包将 foo 的供应副本添加到我的应用程序的环境中PYTHONPATH
(所以 foo 的setup.py install
从不运行)。
这种方法的最大问题是将我的(诚然写得很糟糕)构建包与我的应用程序耦合起来。第二个问题是我的应用程序requirements.txt
应该只将 foo 列为依赖项,并将 foo 的依赖项留给 foo 来确定。最后,如果我忘记设置 GITHUB_OAUTH_TOKEN 环境变量(或者,如果令牌过期,环境变量仍然存在但不再有效)。
哭喊帮忙
我错过了什么(可能是显而易见的)事情?您是如何在应用程序中解决这个问题的?关于让我的构建包正常工作有什么建议,或者希望有一个更简单的解决方案?