【问题标题】:Artifactory expiration of pypi artifactspypi神器的神器过期
【发布时间】:2018-11-06 20:18:49
【问题描述】:

我有一个代理 pypi 存储库,它只能由特定用户更新但所有人都可以访问,我有一个私有 pypi 存储库和一个虚拟存储库来访问它们。

我的问题是一段时间后,虚拟仓库上的任何 pip 安装都会失败,找不到模块的版本。我尝试通过 https//myartifactory/proxy_name-cache/.pypi/module_name 直接访问它,我得到了 404。

https://jfrog.com/knowledge-base/how-to-fix-404-error-resource-has-expired/

我从这里了解了过期策略,事实上,如果我从以前的 URL 中删除 -cache 或者我使用我的虚拟存储库(没有登录工件),模块会更新并且 pip 安装开始上班。

为什么 pip install 命令不触发更新模块并使其可下载的相同机制,我该如何解决这个问题?

@编辑

我会尽力解释得更好 我昨天从 pypi 填充了缓存。今天,工件被标记为已过期(我可以通过在 https//myartifactory/proxy_name-cache/.pypi/module_name.html 上发出一个返回 404 的请求来查看)

因此,执行 pip install module_name 不起作用(找不到满足要求的版本...)。

这是我的问题

事实是,如果我执行返回 404 错误的相同请求,但在 proxy_name 或 virt_name 而不是 proxy_name-cache 上,那么 artifactory 会使用其上游版本更新工件,然后它开始工作(直到它再次标记为过期)

这种行为让我想知道为什么执行 pip 安装而不是简单请求(如 curl 或使用浏览器)也不会使用其上游版本更新工件

为了说明我的问题:

pip install -i https://myartifactory.net/api/pypi/virt/simple requests  # Could not find a version...
curl https://myartifactory.net/pypi-cache/.pypi/requests.html # 404, resource has expired
curl https://myartifactory.net/virt/.pypi/requests.html # 200, returns the html page of versions, meaning it has updated the module with the upstream version
pip install -i https://myartifactory.net/api/pypi/virt/simple requests  # Is now working

【问题讨论】:

  • 不确定是什么问题。您写道,虚拟存储库的命令不起作用,后来写道“如果我从以前的 URL 中删除 -cache 或者如果我使用我的虚拟存储库(没有登录工件),则模块会更新并且pip 安装开始工作。”所以我不确定是什么问题..你能解释得更清楚吗?
  • 我试图更清楚,我编辑了原帖

标签: python pip artifactory pypi


【解决方案1】:

感谢您提供更多信息:)

所以这里的问题是 Artifactory 将元数据/索引文件(在远程存储库上)标记为可过期,以确保元数据/索引文件是最新的。

在您的情况下,您不想让用户能够更改数据,由他们自己从远程获取),因此您希望他们定向到“-cache”存储库。

要实现您想要的,您可以将内容从远程存储库移动/复制到本地存储库。这将确保 Artifactory 将计算元数据并且它不会像在远程存储库中那样过期。

在复制的情况下,如果您担心空间重复,请不要因为 Artifactory 具有基于校验和的存储,这意味着您拥有多少个工件副本并不重要,因为它只会创建一个额外的数据库中的指针意味着从原始文件到该指针的链接:)

【讨论】:

  • 感谢您的回复!我会深入研究它。我只是不确定这个副本是如何工作的。它是可以自动完成的吗?您是否建议这样:jfrog.com/knowledge-base/…
  • 并非如此,您发布的知识库是关于复制的。我的意思是使用复制,它可以通过基于您的系统在 cron 上运行的脚本并触发其余 api 进行复制/移动或编写用户插件(仅在专业版上)以在 afterCreate 关闭时触发。
  • 好的,谢谢。最后一件事:有没有办法停用过期的东西?我们使用的模块都是不应该更改的发布版本。此外,在虚拟仓库触发器上执行未经身份验证的 pip 安装这一事实不会触发模块的更新,但在同一虚拟仓库上的索引文件上执行简单的未经身份验证的 curl 确实会更新模块,是错误还是预期的行为?因为不能直接使用远程 pypi 代理存储库并且必须找到解决方法,这让我有点困扰。
  • 您可以在存储库配置 --> 高级选项卡上更改过期时间。你有缓存参数。请注意,不建议这样做,因为如果新工件是在您上次解决之后发布的并且缓存到期时间尚未过去,您将无法获取它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2013-07-09
相关资源
最近更新 更多