使用virtualenv分离开发和生产依赖关系

9
我有一个简单的Flask应用程序,使用virtualenv来管理依赖关系。但是,我想分离我的依赖项。对于测试,我使用 Flask-Testing,但这是一个我不想包含在生产环境中的依赖项。
如何分离我的依赖关系,以便我可以为开发和生产拥有不同的依赖项?

使用两个不同的 requirements.txt 文件? - Cédric Julien
您可以为每个环境创建不同的文件。请查看此答案 - Sohaib Farooqi
2个回答

7
你可以为不同的环境创建多个requirements.txt文件,例如requirements_dev.txtrequirements_prod.txt等。
这些文件将包含不同版本的固定软件包。可以通过手动使用pip安装软件包,然后将pip freeze输出导入到文件中来生成这些文件。

如果我这样做,我如何在本地机器上使用不同的环境?我能否根据我的不同requirement.txt文件切换环境?我将安装每个requirement.txt文件中的所有软件包,例如,如果我在服务器上运行测试,我将不知道我的测试环境是否缺少某个软件包。 - handris
@handris 通常 requirements-*.txt 文件只包含你不想在其他地方安装的额外软件包。例如,requirements-dev.txt 将包含调试器等,而 requirements_test.txt 还将包含测试库。因此,如果您安装它们所有(因此您将始终安装基本/主文件,但其他文件取决于测试/开发/生产环境),这应该不是问题。否则,您还可以在不同的虚拟环境中安装不同的要求文件,使用 pip install -r requirement_file.txt - tayfun

3

pip-tools是正确的工具。我也遇到了同样的问题,所以用这种简单的方式解决了它。

网站上可以看到:

如果您有不同的环境需要安装不同但兼容的软件包,则可以创建分层要求文件,并使用其中一层来约束另一层。

例如,如果您有一个Django项目,在生产中想要最新的2.1版本,在开发时想要使用Django调试工具栏,则可以创建两个*.in文件,每个文件对应一层:

# requirements.in
django<2.2

在开发需求 dev-requirements.in 文件的顶部,使用 -c requirements.txt 命令来限制开发需求的包,以适应已经在 requirements.txt 中选择的生产环境中的包。
# dev-requirements.in
-c requirements.txt
django-debug-toolbar

首先,像往常一样编译requirements.txt:

$ pip-compile
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile
#
django==2.1.15
    # via -r requirements.in
pytz==2019.3
    # via django

现在编译开发要求,使用requirements.txt文件作为约束条件:
$ pip-compile dev-requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile dev-requirements.in
#
django-debug-toolbar==2.2
    # via -r dev-requirements.in
django==2.1.15
    # via
    #   -c requirements.txt
    #   django-debug-toolbar
pytz==2019.3
    # via
    #   -c requirements.txt
    #   django
sqlparse==0.3.0
    # via django-debug-toolbar

如上所述,尽管Django 2.2版本已经发布,但是开发需要仅包含Django 2.1版本的要求,因为他们受到了限制。现在,可以在开发环境中安全地安装两个编译好的需求文件。
在生产阶段安装需求,请使用:
$ pip-sync

您可以通过以下方式在开发阶段安装所需依赖:

$ pip-sync requirements.txt dev-requirements.txt

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