如何在Azure Pipeline中仅将选定NuGet包发布到Artifactory
解决方案
问题根因
ArtifactoryNuGet@2是JFrog开发的第三方扩展任务,它的pathToNupkg参数仅支持基础的*、**通配符匹配,不支持Azure DevOps原生任务通用的!开头的排除语法,也不支持分号分隔多个匹配规则,因此你之前的配置无法正常识别规则,导致匹配不到任何包。
推荐方案
方案1:使用官方文件匹配任务预处理(最稳定通用)
先用Azure DevOps原生的FindFiles@2任务筛选出符合要求的包路径,再将结果传给Artifactory推送任务,原生任务天然支持排除规则,兼容性最强:
# 筛选符合要求的NuGet包 - task: FindFiles@2 inputs: rootFolder: 'myproject' contents: | **/*.nupkg !foo/**/*.nupkg findMatchOption: 'matchFiles' name: matchedNugetPkgs # 调整后的Artifactory推送任务 - task: ArtifactoryNuGet@2 inputs: command: 'push' artifactoryService: 'AzureToArtifactory' targetDeployRepo: 'acm-nuget-release-local' targetDeployPath: 'Azure_CI_Build/xyzzy/packages' pathToNupkg: '$(matchedNugetPkgs.FoundFiles)'
方案2:前置脚本复制待推送包(灵活可控)
如果需要更复杂的筛选逻辑,可以加一个脚本任务提前把需要的包复制到临时目录,再直接推送临时目录下的所有包:
# PowerShell筛选复制待推送包(Windows/Linux代理都兼容) - pwsh: | New-Item -ItemType Directory -Path $(Build.ArtifactStagingDirectory)/nuget-push -Force Get-ChildItem -Path myproject -Recurse -Filter *.nupkg | Where-Object { $_.FullName -notmatch '[\\/]foo[\\/]' } | Copy-Item -Destination $(Build.ArtifactStagingDirectory)/nuget-push/ -Force displayName: 筛选待推送NuGet包 # 推送临时目录下的包 - task: ArtifactoryNuGet@2 inputs: command: 'push' artifactoryService: 'AzureToArtifactory' targetDeployRepo: 'acm-nuget-release-local' targetDeployPath: 'Azure_CI_Build/xyzzy/packages' pathToNupkg: '$(Build.ArtifactStagingDirectory)/nuget-push/*.nupkg'
方案3:精准匹配替代排除规则(无需额外任务)
如果待推送包的父目录固定且数量少,可以直接枚举要匹配的目录,避免使用排除规则,示例:
pathToNupkg: 'myproject/{bar,baz,other}/**/*.nupkg'
该方案仅适合目录结构固定的场景,扩展性较差。
内容的提问来源于stack exchange,提问作者Ray Depew
相关产品推荐
相关产品推荐

