问题描述
通过 pip freeze
跟踪虚拟环境的要求很简单。
pip freeze > requirements.txt
然而,目前,每当新包添加到 venv
时,都需要手动添加到需求文件中。为此,我通常只需再次运行 freeze 命令并将其通过管道传输到需求文件中,但有时我会忘记运行此命令,这可能会很麻烦,尤其是在不同位置的存储库中,每当我必须记住我需要哪些包时安装!
每当在虚拟环境中安装新软件包时,有没有办法自动更新 requirements.txt
文件以自动包含此新软件包?
解决方法
当仅使用普通的 pip
安装软件包时,目前无法使其自动生成或更新 requirements.txt 文件。它仍然是一个使用 pip freeze > requirements.txt
的手动过程。
如果目的是确保正确跟踪或注册已安装的软件包(即在存储库的版本控制中进行跟踪),那么您将不得不使用“环绕”{ {1}} 的功能。
你有两个选择。
选项 1:使用包管理器
有许多 Python 包管理器将“安装包”与“在某处记录已安装的包”结合起来。
-
pipenv
- "它会自动为您的项目创建和管理 virtualenv,并在您安装/卸载软件包时从您的
pip
添加/删除软件包。它还生成了非常重要的 {{1} },用于生成确定性构建。 - 工作流程(见Example Pipenv Workflow)
Pipfile
- "它会自动为您的项目创建和管理 virtualenv,并在您安装/卸载软件包时从您的
-
poetry
- "poetry 是一种处理依赖项安装以及构建和打包 Python 包的工具。它只需要一个文件即可完成所有这些工作:新的、标准化的
Pipfile.lock
。换句话说,诗歌使用$ pipenv install some-package $ cat Pipfile ... [packages] some-package = "*" # Commit modified Pipfile and Pipfile.lock $ git add Pipfile* # On some other copy of the repo,install stuff from Pipfile $ pipenv install
替换pyproject.toml
、pyproject.toml
、setup.py
、requirements.txt
和新添加的setup.cfg
" - 工作流程(见Basic Usage)
MANIFEST.in
- "poetry 是一种处理依赖项安装以及构建和打包 Python 包的工具。它只需要一个文件即可完成所有这些工作:新的、标准化的
选项 2:git pre-commit hook
此解决方案不会在“安装包期间”发生,但如果目的是确保您跟踪的“requirements.txt”与您的虚拟环境同步,那么您可以添加一个 {{3}那个:
- 生成单独的 requirements_check.txt 文件
- 将requirements_check.txt 与您的requirements.txt 进行比较
- 如果存在差异则中止提交
示例Pipfile.*
:
$ poetry add requests
$ cat pyproject.toml
...
[tool.poetry.dependencies]
requests = "*"
# Commit modified pyproject.toml
$ git add pyproject.toml
# On some other copy of the repo,install stuff from Pipfile
$ poetry install
输出:
.git/hooks/pre-commit
,
使用pipenv代替pip。
这是一个更好的依赖管理器,将确保最佳实践并消除手动工作。
要学习pipenv的使用请阅读这篇文章