如何为多个环境定制requirements.txt文件?

183
我有两个分支:开发和生产。每个分支都有依赖项,其中一些是不同的。开发分支指向正在开发的依赖项。生产分支也是如此。我需要部署到Heroku,Heroku希望每个分支的依赖项在一个名为'requirements.txt'的单个文件中。
最好的组织方式是什么?
我想到的方法有:
- 维护单独的要求文件,每个分支一个(必须经常合并!) - 告诉Heroku我要使用哪个要求文件(环境变量?) - 编写部署脚本(创建临时分支,修改要求文件,提交,部署,删除临时分支)

2
更容易部署脚本:维护2个文件。在它们之间使用符号链接。 - Udy
3个回答

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

您可以级联您的需求文件,并使用“-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"文件,因此它应该像这样完全与生产环境保持一致:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt

2
你忽略了在Heroku上如何使用不同环境的独立需求文件的问题。 - Ed J
51
我相信我的回答已经解决了那个问题。 - Christian Abbott
2
我可能误解了你的问题,或者你的问题与原帖不同。但是为了澄清,staging分支的requirements.txt文件可以包含“-r requirements/staging.txt”(或类似内容),而prod分支的则可以包含“-r requirements/prod.txt”(请参见我的回答结尾)。将适当的分支同步到相应的Heroku实例中。 - Christian Abbott
5
当我使用 pip install foobar 安装新的包时,如何告诉 pip 只将 foobar 作为依赖项放在 requirements/production.txt 中?还是我必须手动将 foobar 放入 requirements/production.txt 文件中? - Manan Mehta
5
@SohamNavadiya,这不是我问的问题。假设我有一个包含3个软件包的base.txt文件和一个包含1个软件包的dev.txt文件(并使用-r base.txt)。所有4个软件包都已安装在我的虚拟环境中。现在我想安装第5个软件包并将其列入base而不是dev,我该怎么做?当然,我可以安装它并使用pip freeze > base.txt命令,但这并不能解决问题。它会将第4个依赖项放入base中,而我不想要这个结果。 - Manan Mehta
显示剩余10条评论

22
今天一个可行的选择是使用pipenv来管理依赖项,这在原问题和答案发布时还不存在。
使用pipenv,不再需要像使用pip一样手动管理两个独立的需求文件,而是通过命令行交互,pipenv自己管理开发和生产包。
要安装一个用于生产和开发的软件包:
pipenv install <package>

仅安装开发环境的软件包:

pipenv install <package> --dev

通过这些命令,pipenv将环境配置存储在两个文件中(Pipfile和Pipfile.lock)。Heroku当前的Python构建包原生支持pipenv,并且如果存在Pipfile.lock,则会从中进行配置,而不是使用requirements.txt。
有关该工具的完整文档,请参阅pipenv链接。

29
pipenv浪费时间,锁定太慢。 - nurettin
37
Pipenv在几乎所有方面都存在问题。它承诺了很多,但实际提供的很少。 - ospider
14
@ospider 我每天都使用pipenv,但并没有像你和nurettin报告的那样遇到负面问题。我使用的是pipenv版本2018.10.13。因此,说它在所有方面都有问题是一个非常空洞的陈述。 - Kwuite
4
我会尽力做到最好。这是需要翻译的内容:@Kwuite,我同意你最后一句话的感受。 当评论批评却毫无意义时,很难进行对话。 - Christian Abbott
5
同意 nurettin 和 ospider 的观点。pipenv 真的很糟糕。 - Andrew Palmer
显示剩余8条评论

8

如果您的需求是在同一台机器上切换不同的环境,可能需要为每个需要切换的环境创建不同的虚拟环境文件夹。

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. 

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