如何为多个环境定制一个 requments.txt?

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

最好的组织方式是什么?

我的想法是:

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

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

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

文件的内容如下:

返回文章页面

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

返回文章页面

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

返回文章页面

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

在 Heroku 之外,你现在可以设置这样的环境:

pip install -r requirements/dev.txt

或者

pip install -r requirements/prod.txt

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

要求:

# Mirrors prod
-r requirements/prod.txt

今天一个可行的选择是使用 Pipenv而不是 pip 来管理依赖关系,这在最初的问答发布时是不存在的。

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

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

pipenv install <package>

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

pipenv install <package> --dev

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

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

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

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.