Answers:
您可以级联需求文件,并使用“ -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
base.txt
其中包含3个程序包,并且dev.txt
其中包含1个程序包(和-r base.txt
)。所有4个软件包都安装在我的虚拟环境中。我现在要安装第5个软件包并在基础列表中列出,而不是在开发人员列表中列出,我该怎么做?当然,我可以安装它,pip freeze > base.txt
但这不能解决问题。然后将第4个dev依赖项放在我不希望的基础上。
今天发布原始问题和答案时不存在的可行选择是使用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链接。
如果您的要求是能够在同一台计算机上的环境之间进行切换,则可能有必要为需要切换到的每个环境创建不同的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.