具有indexurl和extraindexurl的python pip优先级顺序

2024-06-15 02:46:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索了一下,但找不到明确的答案。
目标是,有两个pip索引,一个是私有索引,这将是第一优先级。一个是标准的PyPI。首要任务是防止代码注入的安全风险

假设我有一个名为lib的库,我配置了index_url = http://my_private_pypi_repoextra_index_url = https://pypi.org/simple

如果两个索引中都存在Ipip install liblib。什么索引将获得优先级?从何处安装

另外,如果Ipip install lib=0.0.2但是lib存在于版本0.0.1的私有索引中。它也会关注PyPI吗

控制的好方法是什么,某些库只有在私有索引存在的情况下才能从私有索引中获取,而不会在PyPI中查找


Tags: installpip答案代码pypihttpurl目标
2条回答

这个问题的标题感觉有点像XY problem的例子。如果你能详细说明你想要实现的目标以及你的限制条件,我们可能会给你一个更好的答案

也就是说,中华民国关于管理自己的包装索引并只使用它的建议是一个很好的建议。我还想到了其他一些想法:

  • 更新:结果是pip may run distributions other than those in the constraints file,因此这种方法可能被认为是不安全的。此外hashes are kind of broken关于pip的最新版本

    使用带有散列的约束文件。假设您已在名为requirements.in的文件中记录了依赖项,则可以使用类似pip-toolspip-compile generate-hashes生成此文件。然后您可以安装像pip install -c requirements.txt some_package这样的软件包

    • Pro:可能安装的内容将与VCS中的代码一起记录
    • 缺点:控制第一次下载的内容不是很复杂就是很费力
    • 缺点:散列检查可能很慢
    • 缺点:与不使用哈希时相比,您遇到问题的频率更高。有些人可以在其他人不能的情况下工作;例如,不可能将-e file://`之类的约束与哈希组合
  • 使用另一种打包工具,如pipenv。它的工作原理与前面的建议类似

    • 优点:易于使用
    • 缺点:如果工作流程不适合自然情况,则很难将其集成到您的工作流程中
  • 在当地管理包裹。包和依赖项可以像pip download dest some_dir some_package一样下载,也可以像pip install no-index find-links some_dir一样安装

    • 赞成:如果您跟踪VCS(例如git lfs)中的工件,那么可以在代码旁边记录可能安装的内容
    • 缺点:要么所有的软件包都下载了,要么没有
  • 使用密封的构建系统。我知道bazel将此作为一项功能进行宣传,但对裤子和巴克等其他功能不太确定

    • 赞成:如果你想控制你的构建,这可能是最终的解决方案
    • 缺点:不能很好地与开源python生态系统afaik集成
    • 缺点:开销很大

1https://en.wikipedia.org/wiki/XY_proble

简单的回答是:没有优先级,您可能应该避免完全使用 extra-index-url


这里有这样的问题和答案:https://github.com/pypa/pip/issues/5045#issuecomment-369521345

问题

I have this in my pip.conf:

[global]
index-url = https://myregistry-xyz.com
extra-index-url = https://pypi.python.org/pypi

Let's assume packageX exists in both registries and I run pip install packageX.

I expect pip to install packageX from https://myregistry-xyz.com, but pip will use https://pypi.python.org/pypi instead.

If I switch the values for index-url and extra-index-url I get the same result. pypi is always prioritized.

回答

Packages are expected to be unique up to name and version, so two wheels with the same package name and version are treated as indistinguishable by pip. This is a deliberate feature of the package metadata, and not likely to change.


我还建议阅读以下讨论:https://discuss.python.org/t/dependency-notation-including-the-index-url/5659

本次讨论涉及的内容很多,其中一些内容显然超出了本问题的范围,但无论如何,所有内容都非常有用

在那里,应该有你的钥匙外卖:

理论上,Pip并没有将一个指数置于另一个指数之上。实际上,由于代码实现方式的巧合,可能总是先检查一个,但这不是您应该依赖的行为

And what is a good way to be in control, that certain libraries will only be fetched from the private index if they exists there, and will not be looked for at PyPI?

您应该设置和管理自己的包索引(devpi、pydist、jfrog artifactory、sonatype nexus等),并专门使用它,这意味着:永远不要使用 extra-index-url。这是您可以精确控制下载内容的唯一方法。除了几个依赖项之外,这个自定义存储库可能主要充当公共PyPI的代理


相关的

相关问题 更多 >