2016-11-08 185 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」。 –

相關問題