我在从自托管 Artifactory 安装 NuGet 包时遇到问题。当包 ID 超过 30 个唯一版本时,NuGet 安装命令将无法识别最新版本。检查 NuGet 安装命令的日志,我可以看到它发出两个 Web 请求。
GET https://artifactory.local/artifactory/api/nuget/<repository>/FindPackagesById()?id='<package ID>'
OK https://artifactory.local/artifactory/api/nuget/<repository>/FindPackagesById()?id='<package ID>' 815ms
GET https://artifactory.local/artifactory/api/nuget/<repository>/FindPackagesById()?$skip=80&id='<package ID>'
OK https://artifactory.local/artifactory/api/nuget/<repository>/FindPackagesById()?$skip=80&id='<package ID>' 209 ms
当我运行这些命令时,我得到一个 XML 提要响应,分别包含 30 个和 0 个条目。如果我将第二个请求中的“$skip”参数调整为 30,我会看到我最近的软件包。
Artifactory 是否未返回 80 个条目,从而错误地实现了 NuGet API FindPackagesById 方法?
规范
- Artifactory 版本 4.12.01
- NuGet 命令行版本 3.4.4.1321
最佳答案
本地和虚拟 Nuget 存储库的当前实现要求每页最多 80 个结果。第一个 OData feed 响应(对于第一个没有 $skip 参数的请求)应该能够返回 80 个条目,前提是该包至少有 80 个版本。
当单个包(相同的包 ID)包含在多个不同的存储库中,以及当请求通过聚合这些存储库的虚拟存储库发送时,Artifactory 目前存在且我们知道的问题会发生。如果单个包的版本超过 80 个,Artifactory 将在第一个响应中返回 $skip=80 的分页链接。问题在于 Artifactory(错误地)假设某个包 ID 只存在于虚拟存储库下的一个存储库中,因此将 $skip=n 一一发送到所有聚合存储库,因此,skip=1 实际上跳过了两个实体, Skip=2 实际上跳过了 4,而skip=n 本质上变成了skip=2n。此错误已在此处报告,并将在未来几个月内修复:
https://www.jfrog.com/jira/browse/RTFACT-12379
如果这听起来不像您的问题,请分享您尝试安装的软件包存在多少个版本,您是否使用虚拟存储库,以及同一软件包是否存在于多个存储库中相应的虚拟仓库。
在修复 RTFACT-12379 之前,当前(不太理想)的解决方法要么不使用虚拟存储库来安装具有超过 80 个版本的软件包,要么确保某个软件包不存在于超过 80 个版本的软件包中。一个存储库。
关于nuget - Artifactory NuGet 安装未获取最新的软件包版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40478101/