如何标记Azure DevOps私有NuGet包为已弃用以支持dotnet/nuget检测?
检测Azure DevOps私有源中已弃用的内部NuGet包
问题背景
在Azure DevOps构建流程中,我们可以通过以下命令有效检测nuget.org上的已弃用和易受攻击NuGet包:
dotnet list "HappySolution.sln" package --deprecated --source https://api.nuget.org/v3/index.json --include-transitive dotnet list "HappySolution.sln" package --vulnerable --source https://api.nuget.org/v3/index.json --include-transitive
但内部私有源的包无法发布至nuget.org,无法直接复用上述逻辑检测内部包是否已弃用。
原本计划生成解决方案的包列表,再与私有源「Deprecated」视图中的包对比,使用的命令为:
nuget list -source https://happy.sos/DefaultCollection/_packaging/InternalNuget@Deprecated/nuget/v3/index.json -AllVersions
但nuget list已被弃用,替代它的nuget search不支持-AllVersions选项;同时使用dotnet list指定Deprecated视图源时,始终返回无已弃用包,无法满足检测需求。
可行解决方案
1. 调用Azure DevOps包管理API获取已弃用包列表
通过API直接拉取「Deprecated」视图下的所有包及版本,再与项目依赖做对比:
- 步骤1:获取已弃用包数据(需Azure DevOps PAT令牌授权):
curl -u :{你的PAT令牌} "https://happy.sos/DefaultCollection/_apis/packaging/feeds/InternalNuget/views/Deprecated/packages?api-version=7.1-preview.1&includeAllVersions=true" - 步骤2:导出项目依赖包列表:
dotnet list "HappySolution.sln" package --include-transitive --format json > project-deps.json - 步骤3:编写对比脚本(PowerShell/Python均可),解析两个文件的内容,找出项目中引用的已弃用包,触发构建警告或错误。
2. 自定义单包状态检测逻辑
在构建Pipeline中添加自定义步骤,逐个验证项目依赖包的状态:
- 步骤1:导出项目所有依赖包:
dotnet list "HappySolution.sln" package --include-transitive > project-packages.txt - 步骤2:遍历查询每个包的视图状态:
针对每个包ID和版本,调用API查询其所属视图:curl -u :{你的PAT令牌} "https://happy.sos/DefaultCollection/_apis/packaging/feeds/InternalNuget/packages/{包ID}/versions/{包版本}?api-version=7.1-preview.1" - 步骤3:判断并触发告警:解析API返回结果,若该包版本属于「Deprecated」视图,则抛出构建警告或终止构建。
3. 使用Azure DevOps市场扩展
在Azure DevOps市场中搜索私有源包合规检测类扩展,部分扩展支持自定义视图的包检测,可直接集成到构建流程中,无需手动编写脚本。
内容的提问来源于stack exchange,提问作者thisisntjared
相关产品推荐
相关产品推荐

