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


112

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

最好的组织方式是什么?

我想到的是:

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

1
部署脚本更轻松:维护2个文件。在它们之间使用符号链接。
Udy 2013年

Answers:


208

您可以级联需求文件,并使用“ -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

2
您忽略了如何在heroku上的不同环境中使用单独的需求文件的问题。
Ed J

29
我相信我的回答解决了这个问题。
Christian Abbott

1
我一直在寻找一种对Heroku的暂存(我需要其他调试包)和生产环境(不需要这些调试包)有不同要求的方法。不幸的是,正如@EdJ所说,此答案不能解决这个问题。
安托万·皮萨德

1
我可能会误解您的问题,或者您的问题与原始海报不同。但是为了澄清起见,登台分支的requirements.txt可以包含“ -r requirements / staging.txt”(或类似名称),而prod分支的其中可以包含“ -r requirements / prod.txt”(请参阅​​我的回答的结尾)。将适当的分支同步到其对应的Heroku实例。
克里斯汀·雅培

2
@SohamNavadiya那不是我要的。假设我有一个base.txt其中包含3个程序包,并且dev.txt其中包含1个程序包(和-r base.txt)。所有4个软件包都安装在我的虚拟环境中。我现在要安装第5个软件包并在基础列表中列出,而不是在开发人员列表中列出,我该怎么做?当然,我可以安装它,pip freeze > base.txt但这不能解决问题。然后将第4个dev依赖项放在我不希望的基础上。
Manan Mehta '18

11

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

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

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

pipenv install <package>

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

pipenv install <package> --dev

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

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


4
pipenv浪费时间。锁定时间太长。
nurettin

9
pipenv几乎在所有方面都被破坏了。它承诺很多,但出
货量

5
@ospider每天使用pipenv,并且不会遇到您和nurettin正在报告的负面问题。使用Pipenv版本2018.10.13。因此,从各个方面来看都是断断续续的说法。
库伊特(Kwuite)

1
@Kwuite,我分享你的最后一句话的感情。当评论很重要但很空洞时,几乎没有对话可以进行。
克里斯蒂安·阿伯特

3
同意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. 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.