python - 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
解决方案
感谢您的附加信息 :)
所以这里的问题是 Artifactory 将元数据/索引文件(在远程存储库上)标记为过期,以确保元数据/索引文件是最新的。
在您的情况下,您不想让用户能够更改数据,由他们自己从远程获取),因此您希望他们定向到“-cache”存储库。
要实现您想要的,您可以将内容从远程存储库移动/复制到本地存储库。这将确保 Artifactory 将计算元数据并且它不会像在远程存储库中那样过期。
在复制的情况下,如果您担心空间重复,请不要因为 Artifactory 具有基于校验和的存储,这意味着您拥有多少个工件副本并不重要,因为它只会在数据库意味着从原始文件到该指针的链接:)
推荐阅读
- database - Oracle 数据库 - 从固定长度的文件中删除记录
- mocking - 是否可以在 x-faker 属性中使用具有最小值和最大值的 random.number 来进行 openapi 模拟
- java - ViewHolder 字段在 Fragment 中被初始化为 null
- python - 从场景方面来看,websocket 和烧瓶流有什么区别
- angularjs - 谷歌闭包编译器构建给出错误未处理标志:outputManifest'
- azure-iot-hub - 使用 IoT DevKit 和 Azure IoT Hub 向设备发送云消息 - 设备代码
- javascript - 在 HTML 页面上显示多个图表?
- html - 使图像在单击时打开模式?
- arrays - 多个数组的排列/组合/笛卡尔积的快速生成
- mysql - 带有嵌套子查询的查询平均值