pip 的 requirements.txt 最佳实践

Dar*_*her 10 pip requirements.txt

我正在尝试requirements.txt为某人生成复制我的环境。您可能知道,标准方法是

pip freeze > requirements.txt
Run Code Online (Sandbox Code Playgroud)

我注意到这将列出所有包,包括已安装包的依赖项,这使得这个列表变得不必要。然后我浏览了一下,发现pip-chill它允许我们只列出requirements.txt.

现在,根据我的理解,当有人尝试使用 复制环境时pip install -r requirements.txt,这将自动安装已安装软件包的依赖项。

如果这是真的,这意味着使用pip-chill而不是pip生成requirements.txt. 我的问题是,是否还有其他风险可以使用pip-chill我在这里缺少的已安装软件包的依赖项?

ale*_*ria 10

我相信在构建您的 requirements.txt 时使用pip-compilefrom pip-tools是一个很好的做法。这将确保构建是可预测的和确定性的。

pip-compile命令允许您requirements.txt从依赖项中编译文件,在setup.pyrequirements.in

这是我在构建requirements.txt(如果使用requirements.in)时推荐的步骤:

  1. 创建一个虚拟环境并在那里安装 pip-tools
$ source /path/to/venv/bin/activate
(venv)$ python -m pip install pip-tools
Run Code Online (Sandbox Code Playgroud)
  1. 在requirements.in 文件中指定应用程序/项目的直接依赖项:
# requirements.in
requests
boto3==1.16.51
Run Code Online (Sandbox Code Playgroud)
  1. 使用pip-compile生成requirements.txt
$ pip-compile --output-file=- > requirements.txt

Run Code Online (Sandbox Code Playgroud)

您的 requirements.txt 文件将包含:

#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile --output-file=-
#
boto3==1.16.51
    # via -r requirements.in
botocore==1.19.51
    # via
    #   boto3
    #   s3transfer
certifi==2020.12.5
    # via requests
chardet==4.0.0
    # via requests
idna==2.10
    # via requests
jmespath==0.10.0
    # via
    #   boto3
    #   botocore
python-dateutil==2.8.1
    # via botocore
requests==2.25.1
    # via -r requirements.in
s3transfer==0.3.3
    # via boto3
six==1.15.0
    # via python-dateutil
urllib3==1.26.2
    # via
    #   botocore
    #   requests
Run Code Online (Sandbox Code Playgroud)

您的应用程序应始终使用从生成的requirements.txt. 如果您必须更新依赖项,您只需要更新requirements.in文件并重做pip-compile。我相信这是一种比pip freeze > requirements.txt我看到的一些人所做的更好的方法。

我想使用它的主要优点是您可以在单独的requirement.in文件中跟踪项目的实际直接依赖项

我发现这与在具有package.json(requirements.in) 和package-lock.json(requirements.txt)的节点应用程序项目中管理节点模块/依赖项的方式非常相似。


sin*_*roc 6

从我的角度来看,requirements.txt文件应该列出所有依赖项、直接依赖项及其依赖项(间接依赖项、瞬态依赖项)。如果由于某种原因,只需要直接依赖项,那么有一些工具可以帮助解决这个问题,从粗略的角度来看,pip-chill似乎不够,因为它实际上并不查看代码来找出直接导入的包。也许最好看看pipreqsPigar等项目,它们似乎更准确地确定实际的直接依赖项是什么(基于代码中的导入)。

但最终您应该手动整理此类列表。在编写代码时,您应该仔细选择要导入的包,同样您应该谨慎地整理包含这些包的项目(及其版本)列表。工具可以提供帮助,但开发人员更清楚。