首页 > 解决方案 > pypi神器的神器过期

问题描述

我有一个代理 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 install 开始工作。

为什么 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 上,那么工件会使用其上游版本更新工件,然后它开始工作(直到它被标记为过期再次)

这种行为让我想知道为什么执行 pip install 而不是简单请求(如 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

标签: pythonpipartifactorypypi

解决方案


感谢您的附加信息 :)

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

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

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

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


推荐阅读