Artifactory NuGet安装未获得最新的软件包版本

Artifactory NuGet安装未获得最新的软件包版本,nuget,artifactory,Nuget,Artifactory,从自托管工件安装NuGet软件包时遇到问题。当包ID超过30个唯一版本时,NuGet install命令将无法识别最新版本。通过查看NuGet install命令的日志,我可以看到它发出了两个web请求 GET https://artifactory.local/artifactory/api/nuget/<repository>/FindPackagesById()?id='<package ID>' OK https://artifactory.local/artif

从自托管工件安装NuGet软件包时遇到问题。当包ID超过30个唯一版本时,NuGet install命令将无法识别最新版本。通过查看NuGet install命令的日志,我可以看到它发出了两个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
GEThttps://artifactory.local/artifactory/api/nuget//FindPackagesById()?id=“”
好啊https://artifactory.local/artifactory/api/nuget//FindPackagesById()?id=''815ms
得到https://artifactory.local/artifactory/api/nuget//FindPackagesById()?$skip=80&id=''
好啊https://artifactory.local/artifactory/api/nuget//FindPackagesById()?$skip=80&id=''209毫秒
当我运行这些命令时,我得到一个XML提要响应,分别有三十个和零个条目。如果我将第二个请求中的“$skip”参数调整为30,我将看到我最近的包

Artifactory是否通过不返回80个条目而错误地实现了NuGet API FindPackagesById方法

规格

  • Artifactory版本4.12.01
  • NuGet命令行版本3.4.4.1321

当前使用本地和虚拟Nuget存储库的实现要求每页最多80个结果。第一个OData提要响应(对于其中没有$skip param的第一个请求)应该能够返回80个条目,前提是包至少有80个版本

当单个包(相同的包ID)包含在多个不同的存储库中时,以及当请求通过聚合这些存储库的虚拟存储库发送时,就会出现Artifactory当前存在的问题,我们也知道这一问题。如果单个包的版本超过80个,Artifactory将在第一个响应中返回一个$skip=80的分页链接。问题在于,Artifactory(错误地)假设某个包ID将只存在于虚拟repo下的一个存储库中,因此逐个向所有聚合的repo发送$skip=n,因此skip=1实际上跳过了两个实体,skip=2实际上跳过了4,skip=n实际上变成了skip=2n。此错误在此处报告,并将在未来几个月内修复:

如果这听起来不是您的问题,请共享您尝试安装的软件包的版本数,是否使用虚拟存储库,以及同一软件包是否存在于相应虚拟repo下的多个存储库中


在修复RTFACT-12379之前,目前(不太理想的)解决方法是不使用虚拟存储库来安装具有80多个版本的软件包,或者确保某个包不存在于多个存储库中。

这会发生在虚拟存储库中吗?会发生在虚拟存储库中。这会发生在使用虚拟存储库时,但听起来与我的情况不完全一样。第一个查询不指定任何跳过参数,但返回34个包中只有30个条目的结果。这些包仅存在于虚拟存储库下三个存储库中的一个存储库中。虚拟存储库指向远程存储库,远程存储库指向承载包的本地存储库。如果指定了$skip=30,我确实看到了其他4个包。@MatthewRyan是托管这些包的远程端点吗?是否为Artifactory端点?如果是,你知道什么是人工版本吗?我这么问是因为旧的人工制品版本曾经将页面大小限制为30 IIRC。我会尝试直接查询端点的本地repo(使用相同的FindPackagesById()请求),并查看它是否在第一页返回最多30个结果。另外,尝试直接查询服务器上的远程repo(而不是虚拟的),看看是否会生成正确的$skip值30。这听起来可能就是问题所在。我们正在升级我们的两个Artifactory实例,以便它们位于不同的主要版本上。远程存储库不使用“$skip”,而是指定要继续使用“$skiptoken”的包的显式版本。@MatthewRyan yes,$skiptoken是以前的分页约定,现在已替换为$skip。无论是Artifactory还是NuGet gallery都不再使用它了。在这种情况下,升级第二个实例听起来像是一种方法。