Pip 如何在安装新软件包时自动更新需求文件?

Pip 如何在安装新软件包时自动更新需求文件?,pip,requirements.txt,virtual-environment,Pip,Requirements.txt,Virtual Environment,通过pip freeze跟踪虚拟环境的需求非常简单 pip freeze>requirements.txt 但是,当前,每当新包添加到venv时,都需要手动将其添加到需求文件中。为此,我通常只需再次运行freeze命令并将其导入需求文件,但有时我会忘记运行此命令,这可能会很麻烦,尤其是在不同位置的存储库中,每当我需要记住需要安装哪些软件包时 每当在虚拟环境中安装新软件包时,是否有办法自动更新requirements.txt文件以包含此新软件包?使用PIPNV代替pip 它是一个更好的依赖性管理

通过
pip freeze
跟踪虚拟环境的需求非常简单

pip freeze>requirements.txt
但是,当前,每当新包添加到
venv
时,都需要手动将其添加到需求文件中。为此,我通常只需再次运行freeze命令并将其导入需求文件,但有时我会忘记运行此命令,这可能会很麻烦,尤其是在不同位置的存储库中,每当我需要记住需要安装哪些软件包时


每当在虚拟环境中安装新软件包时,是否有办法自动更新
requirements.txt
文件以包含此新软件包?使用PIPNV代替pip

它是一个更好的依赖性管理器,它将确保最佳实践并消除手工工作

要了解pipenv的使用,请阅读本文


仅使用普通
pip
安装软件包时,目前无法使其自动生成或更新requirements.txt文件。它仍然是一个使用
pip freeze>requirements.txt
的手动过程

如果目的是确保正确跟踪或注册已安装的软件包(即在存储库的版本控制中跟踪),则必须使用其他工具“包装”pip的功能

你有两个选择

选项1:使用包管理器 有许多Python包管理器将“安装包”与“在某处记录已安装的包”结合起来

    • “它会自动为您的项目创建和管理virtualenv,并在您安装/卸载软件包时从
      Pipfile
      中添加/删除软件包。它还会生成非常重要的
      Pipfile.lock
      ,用于生成确定性版本
    • 工作流程(请参阅)
      $pipenv安装一些软件包
      $cat Pipfile
      ...
      [套餐]
      某些包=“*”
      #提交修改后的Pipfile和Pipfile.lock
      $git添加文件*
      #在repo的其他副本上,安装Pipfile中的东西
      $pipenv安装
      
    • “poetry是一种处理依赖项安装以及Python包的构建和打包的工具。它只需要一个文件就可以完成所有这些:新的、标准化的
      pyproject.toml
      。换句话说,poetry使用
      pyproject.toml
      替换
      setup.py
      requirements.txt
      setup.cfg
      MANIFEST.In
      和新添加的
      Pipfile.
    • 工作流程(请参阅)
      添加请求
      $cat pyproject.toml
      ...
      [工具、诗歌、依赖性]
      请求=“*”
      #提交修改后的pyproject.toml
      $git add pyproject.toml
      #在repo的其他副本上,安装Pipfile中的东西
      $POYMENT安装
      
选项2:git预提交钩子 此解决方案不会在“安装软件包期间”出现,但如果目的是确保跟踪的“requirements.txt”与虚拟环境同步,则可以添加一个:

  • 生成一个单独的requirements_check.txt文件
  • 将requirements_check.txt与requirements.txt进行比较
  • 如果存在差异,则中止提交
  • 示例
    .git/hooks/pre-commit

    !/usr/local/bin/bash
    pip冻结>要求检查.txt
    cmp—静默需求\u check.txt requirements.txt
    如果[$?-gt 0];
    然后
    echo“环境中存在不在requirements.txt中的包”
    回显“中止提交”
    rm需求检查.txt
    出口1
    fi
    rm需求检查.txt
    出口0
    
    输出:

    $git状态
    ...
    没什么要承诺的,正在清理树
    $pip安装pydantic
    $git add。
    $git提交
    pip冻结的输出与requirements.txt不同
    中止提交
    $pip freeze>requirements.txt
    $git add。
    $git commit-m“updaterequirements.txt”
    [master 313b685]更新要求.txt
    1个文件已更改,1个插入(+)
    
    使用一些很棒的建议。当我需要这些工具时,我一定会把它放在手边!