【问题标题】:Installing a gem bundle in a python app on Heroku在 Heroku 上的 python 应用程序中安装 gem 包
【发布时间】:2013-08-07 17:48:46
【问题描述】:

我有一个在 Heroku 上运行 Django 的 Python 应用程序。该应用程序启动并完美运行。 push 的前几行如下所示:

(venv)➜  djangoproject git:(development) ✗ git push
Counting objects: 33, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (21/21), done.
Writing objects: 100% (21/21), 1.96 KiB, done.
Total 21 (delta 15), reused 0 (delta 0)

-----> Heroku receiving push
-----> Python/Django app detected
...

我需要在测功机(特别是 Compass)上安装一个 gem 程序。

Heroku 的说明是在根目录中提供 GemfileGemfile.lock 以及所需的 gem。然而,一旦我提供了这个,Heroku 就认为该应用程序是一个 Ruby 应用程序:

(venv)➜  djangoproject git:(development) ✗ git push
Counting objects: 33, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (21/21), done.
Writing objects: 100% (21/21), 1.96 KiB, done.
Total 21 (delta 15), reused 0 (delta 0)

-----> Heroku receiving push
-----> Ruby app detected (NOTE: this is paraphrased)
...

在将网站作为 Python/Django 应用程序运行时,有什么方法可以安装 ruby​​ gem?

【问题讨论】:

  • 这在 heroku 文档中的什么位置?

标签: django heroku


【解决方案1】:

尝试使用heroku config:add BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-python.git明确选择python buildpack

它仍会执行检测过程,但我认为(?)它将运行您之前明确选择的构建包,而不是尝试任何其他构建包,并且由于您仍然安装了 python 应用程序,它应该可以工作。

请注意,在执行 config:add 后,您需要在 Heroku 上重建 slug,目前只能通过通过 git 推送实际代码更改来完成。如果您没有要推送的任何实际更改,则可以使用 git commit --allow-empty -m "Empty commit" 进行空的 git 提交

您还可以使用 --buildpack 命令行选项创建一个新项目。

【讨论】:

  • 绝妙的答案!设置自定义 buildpack 似乎让我可以使用 Python/Django dyno,同时在我的根目录中维护 Gemfile。不幸的是,看起来默认的 heroku buildpack 并没有寻找并自动安装 Gemfiles。我将尝试分叉默认的 buildpack 并让它运行 builder
  • 听起来是个好计划。您也可以利用 Ruby buildpack 的代码来完成该任务。
【解决方案2】:

我遇到了同样的问题,这对我有用: https://github.com/ddollar/heroku-buildpack-multi

它是如何工作的:

  1. 您通过“heroku config:add BUILDPACK_URL=...”命令明确告诉 Heroku 您要使用此“多”构建包
  2. 您在根目录中创建一个 .buildpacks 文件,该文件仅列出您要使用的各种构建包的 git URL。我使用了 python 和 ruby​​ 构建包。
  3. git 推送到 Heroku 并观察所有 buildpack 的使用情况

还值得一提的是,python buildpack 有几个钩子,您可以使用它们来完成额外的自定义工作。如果您创建 bin/pre_compile 文件或 bin/post_compile 文件,那么这些脚本将在主要编译步骤之前/之后由 python buildpack 调用。所以你也可以使用这些钩子来安装 Ruby 或其他依赖项。但是 IMO 让 Ruby 自己的 buildpack 安装 Ruby 依赖项更容易。

【讨论】:

    【解决方案3】:

    您需要使用自定义 buildpack,它允许您构建 ruby​​ 和 python 依赖项。

    1. heroku config:add BUILDPACK_URL=https://github.com/mandest/heroku-buildpack-rubypython
    2. 向您的项目添加 Gemfile 在本地运行捆绑安装(以创建
    3. Gemfile.lock 文件)将您的 Gemfile 和 Gemfile.lock 推送到 heroku

    那应该首先安装 ruby​​,然后运行 ​​bundle install,然后安装 python,以及 requirements.txt 文件中的所有 deps。

    但是,就我而言,我还想使用 ruby​​ 库运行一些命令,即 SASS/COMPASS。为了做到这一点,我认为你有两个选择。第一个,是 fork 上面的存储库并在构建中添加运行这些命令(这​​样他们就拥有所有需要的权限,而不是你运行 heroku run ...)。

    第二个选项是添加一个 Rakefile 并在 rake assets:precompile task 中指定这些内容。

    所以,在我使用 Compass 的情况下,Rakefile 看起来像:

    require 'yaml'
    require 'pathname'
    require 'rspec/core/rake_task'
    include FileUtils
    
    
    namespace 'assets' do
      desc 'Updates the stylesheets generated by Sass/Compass'
      task :precompile do
        print %x(compass compile --time)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多