从VSTS将nuget包推送到nuget.org时忽略重复项

时间:2017-09-08 11:14:58

标签: c# nuget azure-devops continuous-deployment

我在VSTS中构建了一个在存储库中的每次提交时触发的构建。一切都很好,只有一个例外。

我们不会在每次提交时发布新版本的nuget包。因此,我们的nuget推送构建步骤失败,http状态代码为409.我已配置该步骤,以便它可以继续。

由于错误,构建只是“部分成功”。我正在使用一个构建徽章,它也表示相同(没有上下文)。

如何告诉VSTS忽略409或只是替换现有的包(在nuget.org上)?

3 个答案:

答案 0 :(得分:4)

您无法忽略VSTS构建中的409错误,也无法替换服务器中的现有包。

我建议您可以在发行版中推送软件包,如果软件包存在则无法发布。

另一种方法是,您可以在构建期间在推送包(例如PowerShell,REST API)之前检查服务器中的包,并为推送包任务(自定义条件)设置条件。

例如:

  1. 添加变量以构建定义(例如hasPackage为true)
  2. 检查包(PowerShell,Rest API等...)
  3. 如果包存在,请将变量设置为false("##vso[task.setvariable variable=hasPackage;]false"
  4. 设置推送包任务的自定义条件(例如eq(variables ['hasPackage'],'false'))
  5. 更新

    现在,NuGet Push Task支持允许跳过重复项! (只需在NuGet推送任务中选中允许跳过重复项选项。

答案 1 :(得分:1)

我们在 Azure Pipelines 上遇到了相同的重复包问题。

starian chen-MSFT 提出的解决方案很酷,但需要编写一些脚本。

我们找到了需要更少努力的解决方案。您可以使用以下参数创建命令行步骤并调用 dotnet nuget push:

dotnet nuget push $(Build.ArtifactStagingDirectory)/*.nupkg --skip-duplicate --api-key $(Config.NuGetApiKey) --source https://api.nuget.org/v3/index.json

关键是参数--skip-duplicate,如果包已经存在,它只会跳过包。

在变量 $(Config.NuGetApiKey) 中定义 NuGet.org 的 API 密钥。你应该把它设为秘密变量,这样它就不会出现在日志中的任何地方。

这是此命令的 YAML:

steps:
- script: |
   dotnet nuget push $(Build.ArtifactStagingDirectory)/*.nupkg --skip-duplicate --api-key $(Config.NuGetApiKey) --source https://api.nuget.org/v3/index.json
   
  failOnStderr: true
  displayName: 'Publish NuGet Package'

答案 2 :(得分:0)

使用-skipDuplicate标志(自NuGet 5.1起可用):

  

(5.1+)如果已经存在一个软件包和版本,请跳过它并继续进行下一个推送软件包(如果有)。

来源:https://docs.microsoft.com/en-us/nuget/reference/cli-reference/cli-ref-push#options