如何为多个环境自定义requirements.txt?

Cha*_*s R 88 python deployment heroku requirements.txt

我有两个分支,开发和生产.每个都有依赖关系,其中一些是不同的.开发指向本身正在开发的依赖项.同样适用于生产.我需要部署到Heroku,它希望每个分支的依赖关系都在一个名为'requirements.txt'的文件中.

组织的最佳方式是什么?

我想到的是:

  • 维护单独的需求文件,每个分支一个(必须经常合并!)
  • 告诉Heroku我想要使用哪个需求文件(环境变量?)
  • 编写部署脚本(创建临时分支,修改需求文件,提交,部署,删除临时分支)

Chr*_*ott 161

您可以级联您的需求文件并使用"-r"标志告诉pip将一个文件的内容包含在另一个文件中.您可以将需求分解为模块化文件夹层次结构,如下所示:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt
Run Code Online (Sandbox Code Playgroud)

文件的内容如下所示:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...
Run Code Online (Sandbox Code Playgroud)

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...
Run Code Online (Sandbox Code Playgroud)

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...
Run Code Online (Sandbox Code Playgroud)

在Heroku之外,您现在可以设置如下环境:

pip install -r requirements/dev.txt
Run Code Online (Sandbox Code Playgroud)

要么

pip install -r requirements/prod.txt
Run Code Online (Sandbox Code Playgroud)

由于Heroku专门针对项目根目录中的"requirements.txt",它应该只是镜像prod,如下所示:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt
Run Code Online (Sandbox Code Playgroud)

  • 我相信我的回答是这样的. (18认同)
  • 当我使用 `pip install foobar` 安装新包时,如何告诉 pip 将 `foobar` 作为依赖项仅放在 `requirements/production.txt` 中?或者我必须手动将 `foobar` 放在 `requirements/production.txt` 文件中吗? (3认同)
  • @SohamNavadiya 这不是我问的。假设我有一个包含 3 个包的 `base.txt`,以及包含 1 个包的 `dev.txt`(和 `-r base.txt`)。所有 4 个软件包都安装在我的虚拟环境中。我现在想安装第 5 个包并将其列在 base 中,而不是 dev 中,我该怎么做?当然,我可以安装它并使用 `pip freeze > base.txt` 但这并不能解决问题。然后它将第四个开发依赖项放在我不想要的基础中。 (3认同)
  • 您忽略了如何在heroku上为不同环境使用单独的需求文件的问题. (2认同)
  • 我可能误解了您的问题,或者您的问题可能与原始海报不同。但是为了澄清起见,登台分支的 requirements.txt 可以包含“-r requirements/staging.txt”(或类似的),而 prod 分支的一个可以包含“-r requirements/prod.txt”(见我的答案结尾)。将适当的分支同步到其对应的 Heroku 实例。 (2认同)

nur*_*tin 8

如果您的要求是能够在同一台计算机上的环境之间切换,则可能需要为需要切换到的每个环境创建不同的 virtualenv 文件夹。

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
Run Code Online (Sandbox Code Playgroud)


Chr*_*ott 5

今天发布原始问题和答案时不存在的可行选择是使用pipenv而不是pip管理依赖项。

使用pipenv,不再需要像pip一样手动管理两个单独的需求文件,而是通过命令行上的交互来管理开发和生产包本身。

要安装用于生产和开发的软件包:

pipenv install <package>
Run Code Online (Sandbox Code Playgroud)

要仅为开发环境安装软件包:

pipenv install <package> --dev
Run Code Online (Sandbox Code Playgroud)

通过这些命令,pipenv在两个文件(Pipfile和Pipfile.lock)中存储和管理环境配置。Heroku当前的Python buildpack本机支持pipenv,如果存在Pipfile.lock而不是requirements.txt,它将从Pipfile.lock进行配置。

请参阅pipenv链接以获取该工具的完整文档。

  • pipenv在几乎所有方面都被破坏了。它承诺很多,但出货量很少 (3认同)
  • @Kwuite 我同意你最后一句话的观点。当评论批评但空洞时,几乎没有对话可以参与。 (3认同)
  • pipenv浪费时间。锁定时间太长。 (2认同)
  • @ospider每天使用pipenv,并且不会遇到您和nurettin正在报告的负面问题。使用Pipenv版本2018.10.13。因此,从各个方面来看都是断断续续的说法。 (2认同)
  • 同意nurettin和ospider。pipenv太糟糕了。 (2认同)