【问题标题】:How to customize a requirements.txt for multiple environments?如何为多个环境自定义 requirements.txt?
【发布时间】:2013-07-22 03:32:16
【问题描述】:

我有两个分支,开发和生产。每个都有依赖关系,其中一些是不同的。 Development 指向本身正在开发中的依赖项。对于生产也是如此。我需要部署到 Heroku,它期望每个分支的依赖项都在一个名为“requirements.txt”的文件中。

最好的组织方式是什么?

我的想法:

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

【问题讨论】:

  • 更简单的部署脚本:维护 2 个文件。在它们之间使用符号链接。

标签: python deployment heroku requirements.txt


【解决方案1】:

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

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

文件内容如下所示:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

在 Heroku 之外,您现在可以像这样设置环境:

pip install -r requirements/dev.txt

pip install -r requirements/prod.txt

由于 Heroku 专门在项目根目录中查找“requirements.txt”,它应该只是镜像 prod,如下所示:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt

【讨论】:

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

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

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

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

pipenv install <package>

仅安装开发环境的包:

pipenv install <package> --dev

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

有关该工具的完整文档,请参阅 pipenv 链接。

【讨论】:

  • pipenv 是浪费时间。锁定时间太长。
  • pipenv 几乎在所有方面都被破坏了。它承诺很多,但发货很少
  • @ospider 每天都在使用 pipenv,并且没有遇到您和 nurettin 报告的负面问题。使用 pipenv 版本 2018.10.13。因此,在所有方面都被打破是一个非常空洞的陈述。
  • @Kwuite 我同意你最后一句话的观点。当评论批评但空洞时,几乎没有对话可参与。
  • 同意 nurettin 和 ospider。 pipenv 很糟糕。
【解决方案3】:

如果您的要求是能够在同一台机器上的环境之间切换,则可能需要为您需要切换到的每个环境创建不同的 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. 

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2021-06-06
    • 2023-02-19
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多