我有一个Java / Kotlin应用程序,该应用程序每次用户发出请求时都会运行Python脚本。
它可以在我的笔记本电脑和任何其他VPS上正常运行。但是我无法在Heroku上使用它。它不起作用,什么也不打印。
以下是相关代码:
val command = "python3 $s/assets/script.py $params"
println("Command: $command")
val process = Runtime.getRuntime().exec(command)
process.waitFor()
val reader = BufferedReader(InputStreamReader(process.inputStream))
val message = reader.lines().collect(Collectors.joining("\n"))
println(message)
为什么在Heroku上失败?
答案 0 :(得分:1)
Heroku基于buildpacks构建应用。每个buildpack都知道如何构建某种项目,例如一个人可能知道如何安装Maven依赖项并编译Kotlin源代码,而另一个人可能知道如何安装Ruby gems。
在简单的情况下,开发人员不必为此担心太多。如果未明确请求构建包,请使用Heroku tries to infer which buildpack it should use。基本上,它以给定的顺序遍历官方支持的buildpack,并使用每个buildpack的detection script来查看项目是否看起来与该buildpack匹配。
一旦找到匹配的buildpack,它就会停止寻找。在简单的情况下,这通常就足够了。但是每个buildpack都旨在生成相当精简的映像。您可能期望在常规Linux机器上存在的工具不一定存在。特别是,Java / Kotlin构建包不会为您提供python
二进制文件。
好消息是,只需进行一些配置即可使用multiple buildpacks。
heroku buildpacks:set heroku/java
heroku buildpacks:add --index 1 heroku/python
使用heroku buildpacks
列表中的最后一个buildpack将用于确定应用程序的process types。从早期buildpacks定义的任何进程类型都将被忽略。
最后,您可能需要添加一个空的requirements.txt
文件,以防止Python buildpack无法运行。另外,您可以添加任何可能具有的Python依赖项。
如果您确实具有Python依赖项,请考虑使用Pipfile
和Pipfile.lock
而不是requirements.txt
。这将导致您的应用是使用pipenv
而不是pip
构建的。