如何检查指定NuGet包是否已存在于ProGet仓库源中
实现方案
完全可以通过标准NuGet工具实现ProGet源的包版本校验,ProGet完全兼容官方NuGet API,不需要使用专用工具,以下是两种Azure Pipeline中常用的实现方式:
方案1:使用nuget.exe校验
方式A:适配所有版本nuget.exe
通过list命令拉取指定包的全量版本后做精确匹配,兼容性最高:
- 基础命令格式:
# 匹配精确包名和版本,Windows环境用findstr,Linux/macOS用grep nuget list <你的包名> -Source <ProGet源地址> -AllVersions -Prerelease | findstr /r /c:"^<你的包名> <目标版本号>$"
- Azure Pipeline PowerShell任务示例:
$packageName = "Sample.Package" $packageVersion = "1.2.3" $progetUrl = "https://你的ProGet地址/nuget/你的源名/v3/index.json" $progetApiKey = "$(ProGetApiKey)" # 引用Azure Pipeline保密变量 # 校验包是否存在 $matchResult = nuget list $packageName -Source $progetUrl -AllVersions -Prerelease | Where-Object { $_ -match "^$packageName ([\w\.\-]+)$" } | Where-Object { $matches[1] -eq $packageVersion } if ($matchResult) { Write-Host "包 $packageName $packageVersion 已存在,跳过上传" } else { Write-Host "包不存在,开始上传" nuget push ./downloaded-packages/$packageName.$packageVersion.nupkg -Source $progetUrl -ApiKey $progetApiKey }
方式B:nuget 5.8+版本专用
高版本nuget.exe提供了专门的exists命令,逻辑更简单,直接通过返回值判断即可:
- 命令:
nuget exists <包名>.<版本号>.nupkg -Source <ProGet源地址> - 返回值为0代表包已存在,非0代表不存在,可直接在流水线任务中通过
successCriteria判断执行逻辑。
方案2:使用dotnet nuget命令(无需单独安装nuget.exe)
若Azure Pipeline代理预装了.NET SDK,可直接用dotnet原生命令,环境依赖更少:
- 校验命令(.NET 7+支持直接判断):
dotnet nuget search <你的包名> --source <ProGet源地址> --prerelease --exact-match | Where-Object { $_.Version -eq "<目标版本号>" }
- 上传命令:
dotnet nuget push <nupkg文件路径> --source <ProGet源地址> --api-key <你的API密钥>
注意事项
- 如果ProGet源开启了身份验证,建议提前把源地址和凭证写入
nuget.config文件,避免命令行明文传递敏感信息 - 所有敏感配置(API密钥、账号密码)都建议存储在Azure Pipeline的保密变量/变量组中,不要明文写在流水线yaml里
- 若需要校验大量包,建议调用ProGet的原生API做批量校验,比逐次调用nuget命令性能更高
内容的提问来源于stack exchange,提问作者Lumberjack
相关产品推荐
相关产品推荐

