【问题标题】:python pip priority order with index-url and extra-index-urlpython pip优先顺序与index-url和extra-index-url
【发布时间】:2021-07-19 00:43:47
【问题描述】:

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

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

如果我pip install liblib 都存在于两个索引中。什么索引将获得优先权?从哪里安装?

另外,如果我 pip install lib=0.0.2 但 lib 存在于我的私有索引中,版本为 0.0.1。是否也会考虑 PyPI?

什么是控制的好方法,如果某些库存在于私有索引中,它们只会从私有索引中获取,并且不会在 PyPI 中查找?

【问题讨论】:

    标签: python pip pypi python-packaging


    【解决方案1】:

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


    这里问和回答:https://github.com/pypa/pip/issues/5045#issuecomment-369521345

    问题

    我的 pip.conf 中有这个:

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

    假设 packageX 存在于两个注册表中,我运行 pip install packageX。

    我希望 pip 从 https://myregistry-xyz.com 安装 packageX,但 pip 将使用 https://pypi.python.org/pypi

    如果我切换 index-url 和 extra-index-url 的值,我会得到相同的结果。 pypi 总是优先的。

    回答

    包在名称和版本上应该是唯一的,因此具有相同包名称和版本的两个轮子被 pip 视为无法区分。这是包元数据的特意设计,不太可能改变。


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

    本次讨论中涉及了很多事情,有些显然超出了这个问题的范围,但无论如何,一切都非常有用。

    在那里,应该有关键的外卖:

    理论上,Pip 并没有真正优先考虑一个索引。在实践中,由于代码实现方式的巧合,可能总是先检查一个,但这不是您应该依赖的行为。

    什么是控制的好方法,某些库只有在私有索引存在时才会从私有索引中获取,并且不会在 PyPI 中查找?

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


    相关

    【讨论】:

    • 有没有办法使用 gitlab 对公共 pypi 进行代理?
    【解决方案2】:

    这个问题的标题感觉有点像XY problem的实例。如果您能详细说明您想要实现的目标以及您的限制是什么,我们或许可以为您提供更好的答案。

    也就是说,sinoroc 建议管理您自己的包索引并仅使用它是一个很好的建议。还想到了其他一些想法:

    • 更新:原来是pip may run distributions other than those in the constraints file,所以这种方法可能应该被认为是不安全的。此外,hashes are kind of broken 最近发布的 pip。

      使用带有哈希的约束文件。该文件可以使用pip-tools 生成,如pip-compile --generate-hashes 假设您已将依赖项记录在名为requirements.in 的文件中。然后你可以安装像pip install -c requirements.txt some_package这样的包。

      • 专业人士:可能安装的内容与您的代码一起记录在您的 VCS 中。
      • 缺点:控制第一次下载的内容要么很棘手,要么很费力。
      • 缺点:哈希检查可能很慢。
      • Con:与不使用哈希相比,您遇到问题的频率更高。有些可以解决,有些则不能;例如,不可能将 -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

    【讨论】:

    • 我认为这很清楚。我在 gitlab 有我的私有 PyPI 索引。如果有人碰巧在 PyPI 上创建了这样的包,我不希望 pip install 命令意外地从公共 PyPI 下载包。这显然是一个安全问题。
    • 在那种情况下,我绝对认为 sinorocs 建议是要走的路。出于好奇,1. pip install 将仅作为自动化工作负载的一部分运行还是手动运行? 2.您是否担心项目的恶意发布? 3.您是否担心域名抢注?
    • 1.手动和自动。 2. 是的,这就是这里的主要问题 3. 什么是“抢名”?
    • 感谢您满足我的好奇心。 Typo-squatting 可能是一个更好的术语;我指的是恶意行为者以类似的名称将更改的项目上传到 pypi 的做法,希望有人会意外下载他们的恶意分发。例如,他们可能会尝试分叉 numpy,嵌入一些恶意软件并将其发布为 nunpy。在实践中,这似乎是一个温和的威胁。其实this is the only incident我记得听说过。
    猜你喜欢
    • 2019-05-27
    • 2020-02-27
    • 1970-01-01
    • 2013-05-08
    • 2021-09-22
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多