如何使用Azure PowerShell模块下载Azure DevOps通用构件
你已经能用Azure CLI完成通用构件的发布,确实目前Azure PowerShell模块没有直接对应az artifacts universal publish的Cmdlet,但可以通过调用Azure Artifacts的REST API结合PowerShell来实现发布和下载操作,以下是具体方案:
一、发布通用构件
发布需要调用UniversalPackages/feed/{feedId}/package/{packageName}/version/{packageVersion}/content这个REST API端点,步骤如下:
- 准备有权限的PAT(个人访问令牌),需要授予
Packaging (Read & Write)权限 - 编写PowerShell脚本实现发布,示例如下:
# 配置参数 $organization = "msazure" $project = "abc" $feed = "你的Feed名称" $app = "你的构件名称" $version = "1.0.0" $path = "本地构件文件/文件夹路径" $pat = "你的PAT令牌" # 构造认证头 $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) $headers = @{Authorization = "Basic $base64AuthInfo"} # 获取Feed ID(如果不知道Feed ID,可以通过这个API查询) $feedId = (Invoke-RestMethod -Uri "https://feeds.dev.azure.com/$organization/$project/_apis/packaging/feeds?api-version=7.1-preview.1" -Headers $headers).value | Where-Object { $_.name -eq $feed } | Select-Object -ExpandProperty id # 上传构件 $uploadUri = "https://feeds.dev.azure.com/$organization/$project/_apis/packaging/feeds/$feedId/upack/packages/$app/versions/$version?api-version=7.1-preview.1" Invoke-RestMethod -Uri $uploadUri -Method Put -Headers $headers -InFile $path -ContentType "application/octet-stream"
二、下载通用构件
下载需要先查询到目标版本的构件内容地址,再执行下载:
- 先通过你提到的API查询包的版本信息:
# 查询包信息(对应你提供的REST API) $packageQueryUri = "https://feeds.dev.azure.com/$organization/$project/_apis/packaging/Feeds/$feedId/packages?packageNameQuery=$app&api-version=7.1-preview.1" $packageInfo = Invoke-RestMethod -Uri $packageQueryUri -Headers $headers # 获取目标版本的下载地址 $targetVersion = $packageInfo.value.versions | Where-Object { $_.version -eq $version } | Select-Object -ExpandProperty downloadUrl
- 执行下载:
# 下载到本地指定路径 Invoke-RestMethod -Uri $targetVersion -Headers $headers -OutFile "本地保存路径/文件名"
关于REST API的补充说明
你提到的GET https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/packages?packageNameQuery={packageName}确实主要用于查询包的基本信息,但Azure Artifacts还提供了专门用于发布和下载的REST API端点,上面的脚本就是基于这些端点实现的。
另外,你原来使用的Azure CLI发布命令如下,供参考:
```az artifacts universal publish --organization https://msazure.visualstudio.com/
--project "abc" --scope project
--feed "$feed" --name "$app"
--version $version `
--path $path
内容的提问来源于stack exchange,提问作者Node.JS

