如何获取Azure Devops API的PackageID?

4

我需要获取存储在Azure Devops中的通用包的可用版本列表。我考虑调用REST API “获取包版本”来获取一个源上包的版本列表。

GET https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/Packages/{packageId}/versions?api-version=5.1-preview.1

问题在于它需要一个包ID,这是GUID,我只知道名称。到目前为止,我唯一想出来的将包名转换为GUID的方法是使用"获取包",但它会返回Feed上的每个包(对我来说包括数千个NPM包),这使得下载非常庞大,而我只需要少量的项目。有没有办法提取给定包名的包ID?或者有更好的方法来提取包的所有版本?

1
这个API以及许多其他DevOps API都支持idOrName概念,因此您可以使用ID或名称。简而言之:尝试使用名称。甚至这份文档(https://learn.microsoft.com/en-us/rest/api/azure/devops/artifactspackagetypes/universal/get%20package%20version?view=azure-devops-rest-5.1)使用名称作为占位符。 - D.J.
不幸的是,Get Version API 是用于“显示有关软件包版本的信息”,而不是获取版本列表。我同意有些 API 获取名称,而其他 API(例如 Get Package Versions)则需要“软件包 ID(GUID ID,而非名称)”。 - Chuckkir
2个回答

3

有人指出,Get Packages API有IncludeAllVersionspackageNameQuery选项,可以实现我想要的功能,而不需要使用GetAllVersions

https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/Packages?includeAllVersions=true&packageNameQuery={packageName}&protocol​Type=nuget

请原谅我之前的误导并错过了这个API。很高兴你能找到正确的API,让你避免了另一个麻烦。你可以接受答案,这样其他SO用户就可以参考这个解决方案了 :-) - Mengdi Liang

1

我假设你已经查看了一些文档,并发现没有直接的API可以让你获取指定的包ID,对吧?另外,正如文档所述,此API中不能使用软件包名称:

enter image description here


实际上,你离答案非常接近。在运行获取程序包时只需添加一些过滤器即可。但这需要你在 Powershell 命令行或 Powershell ISE 中执行一些脚本,这是最方便的方法。你也可以在 Azure Devops 管道中运行以下脚本,但与在命令行中运行相比,它有点繁琐。
在你的Powershell命令行Powershell ISE中运行以下脚本:
$token = "{your PAT token}"
$url = 'https://feeds.dev.azure.com/{org name}/_apis/packaging/Feeds/{feed ID}/packages'

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))

$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get

$results = $response.value | Where {$_.name -eq "{Package Name}"} #|

Write-Host "results = $($results | ConvertTo-Json -Depth 100)"

请注意:在上述脚本中,您只需要替换PAT tokenOrganization name和您的package name的值即可。

然后您将获得指定软件包的信息,您可以从命令行复制软件包ID并在其他地方使用:

enter image description here

注意:以上脚本也可以在Azure Devops的Powershell任务中使用,无需进行任何更改。


谢谢您提供这个脚本。虽然我不是PowerShell专家,但看起来它是从服务器中获取整个软件包列表并在本地进行筛选。如果是这样的话,那么我已经在做同样的事情了,但问题仍然存在,即发送整个列表和解析JSON需要太长时间。我需要它更快地工作,所以我希望我错过了一个API或技术,可以获取少于所有软件包的ID,并在服务器上进行筛选。 - Chuckkir
@Chuckkir 很抱歉告诉你,Azure DevOps 目前还不支持在服务器上提供和支持筛选功能。由于你说你有近千个包,因此此脚本首先不会返回整个结果。请看我的脚本的第五行,它只使用脚本中的筛选器返回您想要的特定结果。这可以帮助减少返回时间。 - Mengdi Liang
下载所有软件包的列表;你在第4行中进行的REST调用。这会带来大量的数据。然后我提取GUID并进行Get Package Versions的REST调用。这都在一个脚本中。 - Chuckkir
由于我正在调用“获取软件包版本”的函数,所以同名的版本数量并不重要?但是,我想可能会有不同类型的软件包具有相同的名称?在这种情况下,它可以返回所有版本,我很乐意选择正确的类型。 - Chuckkir
你从哪里获取feedid的值? - Sujit.Warrier
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接