2016-11-08 192 views
0

从自托管Artifactory安装NuGet软件包时遇到问题。当软件包ID超过30个独特版本时,NuGet安装命令将无法识别最新版本。检查来自NuGet安装命令的日志,我可以看到它发出两个Web请求。Artifactory NuGet安装无法获取最新软件包版本

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提要响应。如果我将第二个请求中的'$ skip'参数调整为30,我会看到最近的包。

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

规格

  • Artifactory的版本,01年4月12日
  • 的NuGet命令行版本3.4.4.1321
+0

这是否发生在虚拟存储库? –

+1

它确实发生在虚拟存储库中。 –

回答

2

当前实现与本地和虚拟的NuGet库任务每页80个结果的最大值。第一个OData提要响应(对于没有$ skip参数的第一个请求)应该能够返回80个条目,前提是该包至少有80个版本。

Artifactory目前有一个问题,当多个不同存储库中包含单个程序包(相同程序包ID)时,以及通过聚合这些存储库的虚拟存储库发送请求时,Artifactory会发生这种问题。如果单个包的版本超过80个,Artifactory会在第一个响应中返回带有$ skip = 80的分页链接。问题在于Artifactory(错误地)认为某个包ID只会存在于虚拟仓库下的一个仓库中,因此会将$ skip = n一个一个地发送到所有的汇总仓库,因此skip = 1实际上会跳过两个实体, skip = 2实际上跳过4,skip = n本质上变成skip = 2n。这个bug在这里报道,并且将其固定在未来几个月:

https://www.jfrog.com/jira/browse/RTFACT-12379

如果这听起来不像你的问题,请您分享多少个版本你要安装的程序包存在,不管你是否使用虚拟仓库,以及相应虚拟仓库下的多个仓库中是否存在相同的软件包。

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

+1

使用虚拟存储库时发生这种情况,但这听起来不像我的情况。第一个查询没有指定任何跳过参数,但返回的结果只有30个输入了34个包。软件包仅存在于虚拟存储库下的三个存储库中。虚拟存储库指向指向托管软件包的本地存储库的远程存储库。 如果$ skip = 30被指定,我会看到其他4个包。 –

+0

@MatthewRyan承载这些包的Artifactory端点的远程端点?如果是的话,你知道什么Artifatory版本?我问,因为旧的Artifactory版本用于限制页面大小为30 IIRC。我试着直接查询该端点的本地回购(使用相同的FindPackagesById()请求),并查看它是否返回第一页最多30个结果。此外,试着直接查询服务器上的远程回购(不是虚拟),看看是否产生了正确的$ skip值为30. –

+0

这听起来像是这可能是问题。我们正在升级我们的两个Artifactory实例,以便它们处于不同的主要版本。远程存储库不会使用“$ skip”,而是指定包的明确版本以继续使用“$ skiptoken”。 –

相关问题