【问题标题】:How do I ensure pip gets package from internal pypi?如何确保 pip 从内部 pypi 获取包?
【发布时间】:2019-09-20 04:08:02
【问题描述】:

我有一个带有requirements.txt 的应用程序,其中包括许多第三方库以及一个必须从私有pypi 实例下载的内部包。比如:

boto3
flask
flask-restplus
gunicorn
an_internal_package

问题是an_internal_package 被命名为很常见的东西,并且遮挡了全局 pypi 上已经可用的包。例如,我们称之为twisted。我遇到的问题是在requirements.txt 中设置--extra-index-url 似乎仍然从全局pypi 中获取twisted

--extra-index-url=https://some.internal.pypi.corp.lan
boto3
flask
flask-restplus
gunicorn
twisted # actually an internal package

我怎样才能指出twisted 应该只从私有pypi 加载,而不是从全局加载?

【问题讨论】:

  • 务实的解决办法是重命名内部包,避免名称冲突。
  • Finding Packages 来自 PyPA 状态:There is no ordering in the locations that are searched, rather they are all checked, and the “best” match for the requirements - 它引用了一个 PEP,这似乎表明您需要通过版本控制来解决这个问题。 ...相关-Private PyPI containing package with same name(答案)。
  • @wim 是的,我认为你是 100% 正确的。正如 wwii 所表明的那样,pip 几乎无法控制找到包的位置。
  • 如果您可以选择内部 PyPI 服务器,请考虑使用 devpi,因为它具有内置的欺骗保护 - 一旦您将包上传到内部服务器,它就会停止在其他地方寻找其他版本。因此,您可以将需要的版本中的twisted 上传到devpi,使用--index-url 指向它,然后devpi 将完成剩下的工作。

标签: python pip pypi


【解决方案1】:

您可以参考index 寻求解决方案,它有点棘手。您应该同时处理私有 pypi 和主 pypi。

您应该使用 --index-url,而不是使用 --extra-index-url。但是阅读我建议您通读给定的链接

【讨论】:

  • 这与--extra-index-url的行为相同,它改变了文件中所有依赖项的索引,而不仅仅是一个。
  • 我建议 - 您应该同时处理私有 pypi 和主 pypi。现在是他必须处理的条件。
【解决方案2】:

您可以直接链接到内部索引上的包:

boto3
flask
flask-restplus
gunicorn
https://some.internal.pypi.corp.lan/simple/twisted/Twisted-19.2.0.tar.bz2

这具有固定依赖项的效果,但无论如何这通常被认为是最佳实践。

【讨论】:

  • 注意:这会固定版本(在requirements.txt 文件中不一定是坏事,但值得一提)。
  • @DustinIngram 这似乎很合理——理想情况下,固定版本是可选的。你知道pypi rest api是否支持吗?
  • 这里不是可选的,因为您链接到要安装的特定发行版。 PyPI 没有 REST API,它有所谓的"simple" API。我认为您正在寻找的是来自pip 的支持。
  • @DustinIngram 版本锁定的一个简单解决方法是在内部pypi 上添加一个latest 符号链接。因此,我认为这应该是公认的解决方案。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 2015-12-06
  • 2014-02-27
  • 2019-08-16
  • 1970-01-01
  • 2020-04-21
  • 2012-12-18
  • 2019-05-14
相关资源
最近更新 更多