我有两个分支,开发和生产。每个都有依赖关系,其中一些是不同的。Development 指向本身正在开发中的依赖项。对于生产也是如此。我需要部署到 Heroku,它期望每个分支的依赖项都在一个名为“requirements.txt”的文件中。
最好的组织方式是什么?
我想到的:
- 维护单独的需求文件,每个分支一个(必须经受住频繁的合并!)
- 告诉 Heroku 我要使用哪个需求文件(环境变量?)
- 编写部署脚本(创建临时分支、修改需求文件、提交、部署、删除临时分支)
我有两个分支,开发和生产。每个都有依赖关系,其中一些是不同的。Development 指向本身正在开发中的依赖项。对于生产也是如此。我需要部署到 Heroku,它期望每个分支的依赖项都在一个名为“requirements.txt”的文件中。
最好的组织方式是什么?
我想到的:
您可以级联您的需求文件并使用“-r”标志告诉 pip 将一个文件的内容包含在另一个文件中。您可以将您的要求分解为模块化文件夹层次结构,如下所示:
`-- django_project_root
|-- requirements
| |-- common.txt
| |-- dev.txt
| `-- prod.txt
`-- requirements.txt
文件的内容如下所示:
常见的.txt:
# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...
开发者.txt:
# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...
产品.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,如下所示:
要求.txt:
# 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,如果 Pipfile.lock 存在而不是 requirements.txt ,它将对其进行配置。
有关该工具的完整文档,请参阅 pipenv 链接。
如果您的要求是能够在同一台机器上的环境之间切换,则可能需要为您需要切换到的每个环境创建不同的 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.