使用Django和NPM在Heroku上创建应用程序

24

我正在编写一个包含 CoffeeScript 的 Django 应用。为了实现这一点,我使用 django-compressor 来在启动应用之前将 CoffeeScript 编译为 JS。django-compressor 要求安装 NPM 才能编译 CoffeeScript。

现在我想在 Heroku 上部署此应用程序。我不能把 npm 放在我的 requirements.txt 文件中,所以我想知道如何在 Heroku 服务器上获取 npm?

6个回答

34

如果您想避免维护自定义的构建包,可以使用多重构建包

使用多重构建包非常简单:

  1. 运行heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
  2. 在代码库根目录下创建一个 .buildpacks 文件,并添加两行内容: https://github.com/heroku/heroku-buildpack-nodejs.git
    https://github.com/heroku/heroku-buildpack-python.git
  3. 创建 package.json 文件并添加您的npm依赖项。
  4. 运行npm install

Heroku现在正式支持多个构建包:https://github.com/heroku/heroku-buildpack-multi - yellowcap

19

注意:如今多重构建包是实现此目的的更好方式 :)


我创建了一个 Python 官方 heroku buildpack 的 fork,它允许使用可选的 npm_requirements.txt 文件来安装这些依赖项。

我现在正在使用 coffeescript 和 less-css 以及 django-compressor 在 heroku 上进行开发 :)

https://github.com/jiaaro/heroku-buildpack-django

编辑:要从标准 buildpack 切换到我的 buildpack:

  1. 使用 heroku 命令行应用程序设置 BUILDPACK_URL 环境变量:

  2. heroku config:add BUILDPACK_URL=git://github.com/jiaaro/heroku-buildpack-django.git 
    

1
你好!我非常喜欢buildpack pack,第一次使用后我正在用它构建另一个项目!然而,当我启动应用程序时,它会崩溃。我在日志中查看,它说“ImportError: No module named site”。我在INSTALLED_APPS中有'django.contrib.sites'SITE_ID = 1,就像https://dev59.com/3GbWa4cB1Zd3GeqPWGPp中所述。然后我创建了一个Hello World类型的应用程序,但是得到了相同的错误。你知道可能是什么原因吗?Heroku那边是否有任何更改? - Alexis
1
哇,我认为如果在bin\release中将python $PROJECT/manage.py runserver 0.0.0.0:\$PORT --noreload更改为python manage.py runserver 0.0.0.0:\$PORT --noreload,事情就会变得好起来!看起来Heroku改变了一些东西,因为你之前的东西是可以工作的。我添加了一个Procfile来做这个,并且事情开始不再抛出错误 :) 另外,使用buildpack更新存储库不起作用。之前我是这样做的:$ heroku create然后更新,然后heroku config:add BUILDPACK_URL=http://github.com/jiaaro/heroku-buildpack-django.git。但这并没有起作用。 - Alexis
为了使事情正常工作,似乎必须像这样完成:heroku create --stack cedar --buildpack http://github.com/jiaaro/heroku-buildpack-django.git。再次感谢 Jiaaro 提供的优秀代码。希望这对其他人有所帮助,或者您可以友好地更新它 :) - Alexis
也许这个答案是在多重构建之前的,但那绝对是更好的方法。 - Yaniv Aknin
@YanivAknin 是的,我会建议使用多构建包,事实上,这是我现在采用的方法。 - Jiaaro
显示剩余3条评论

3

我在解决自己的问题时在谷歌上发现了这个问题。 我合并了两个官方构建包(python和nodejs),因此现在可以通过运行以下命令拥有带有标准npm描述文件package.json的Django项目:

heroku config:add BUILDPACK_URL=https://github.com/podshumok/heroku-buildpack-python

这种解决方案与Jiaaro的方案有以下区别:
  • 它基于更新(12月)版本的Buildpacks(例如,在部署时运行collectstatic)
  • 您需要正确的 package.json 文件(至少应在此文件中指定产品的名称和版本)
  • npm依赖项应在 package.json 中列出

工作得非常好!+1 避免使用自定义构建包,因为根据我的经验,Jiaaro 和 Alex-zak 的构建包似乎不再起作用。 - John Lehmann

3
@Jiaaro的解决方案对我没用...导致奇怪的错误.../:
File "almalinks/manage.py", line 8, in <module>
from django.core.management import execute_from_command_line
ImportError: No module named django.core.management

我太累了,不想处理它,所以我四处寻找,发现了这个好用的资源:
- Heroku-Django手册

他们解释了如何添加自己的脚本,以便与Heroku的默认构建包配合使用。
非常好用。 :)


3

1

Heroku 领域的事情已经发生了改变

不再需要多个构建包、.buildpack 文件或自定义构建包。只需将所需的官方 Heroku 构建包添加到您的 Heroku 应用程序中,它们将按照输入顺序执行。使用索引选项按需要重新排序。

heroku buildpacks:add --index 1 heroku/nodejs -a your_app_name

没有必要使用gunt任务、像django-bower这样的应用程序,或者其他占用服务器资源和减缓构建时间的专门工具。 您可以在此处查看有关如何无缝集成Django + Bower + Heroku的教程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接