决定是否允许 pip-tools 中不安全的包版本的正确方法是什么?

What is the proper way to decide whether to allow unsafe package versions in pip-tools?

我正在尝试使用 pip-tools 来管理 venv(如 python -m venv .venv)环境。刚激活的环境最初只有 pip-tools:

> pip list
Package   Version
--------- -------
Click     7.0
pip       19.3.1
pip-tools 4.2.0
six       1.13.0

我只创建了一个 requirements/main.in 文件:

numpy
matplotlib

运行 pip-compile --upgrade --build-isolation --generate-hashes --output-file requirements/main.txt requirements/main.in 给我这个警告:

# WARNING: The following packages were not pinned, but pip requires them to be
# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag.
# setuptools==41.6.0        # via kiwisolver
The generated requirements file may be rejected by pip install. See # WARNING lines for details.

如警告,pip install --upgrade -r requirements/main.txt 拒绝操作:

ERROR: In --require-hashes mode, all requirements must have their versions pinned with ==. These do not:
    setuptools from https://files.pythonhosted.org/packages/d9/de/554b6310ac87c5b921bc45634b07b11394fe63bc4cb5176f5240addf18ab/setuptools-41.6.0-py2.py3-none-any.whl#sha256=3e8e8505e563631e7cb110d9ad82d135ee866b8146d5efe06e42be07a72db20a (from kiwisolver==1.1.0->-r requirements/main.txt (line 11)) 

所以现在我的困境是:我应该使用--allow-unsafe吗?这样做的含义是什么?我尝试了一下,发现生成的需求文件已固定到那个特定版本,kiwisolver(我猜 numpy/matplotlib 的传递依赖)需要对吗?但是为什么这是不安全的呢?

如果我理解正确,我可以根据需要保留生成的需求,但随后 - 每当我决定更新时 - 我可以重新 运行 pip-compile 并创建新需求文件将是新的,它可能有一个没有此限制的新 kiwisolver,对吗?

pip-tools 要求我做出此决定的原因是什么?为什么这可能是不安全的?有哪些例子表明人们不想使用 --allow-unsafe?

一个相关的问题是:我可以只为设置工具指定“--allow-unsafe”吗?它似乎是 pip-compile 的一个参数,这是一种全有或全无的方法。我可以只将特定的标记为 "ok to pin" 吗?如果出现其他情况,我想再次收到警告,以便我评估是否可以?

So now my predicament is: should I use --allow-unsafe? What are the implications of doing this?

是的,你应该。此选项允许您固定 requirements.txt 以下包:distributepipsetuptools。不介意的话就继续吧!

But why is this unsafe?

据我所知,由于以下原因,这些包裹可能被认为是不安全的:

  • 更改 setuptools 可能会导致与 pip 冲突( distributesetuptools 的遗留包装器,它是 自 2013 年起弃用)。
  • 更改 pip 可能会破坏 pip-tools 本身或

--allow-unsafe 选项很可能会在不久的将来被弃用,请参阅 pip-tools' and pip's 问题跟踪器中的讨论。