使用矩阵配置将特定项目部署到 NuGet

Deploy a specific project to NuGet with a matrix configuration

我的 appveyor.yml 如下所示:

environment:
  matrix:
  - solution_name: Src/App1.sln
  - solution_name: Src/App2.sln

before_build:
- cmd: dotnet restore %solution_name%

build:
  project: '%solution_name%'
  publish_nuget: true

after_build:
  - dotnet pack Src\App1.csproj
   
deploy:
  - provider: NuGet
    api_key:
      secure: [my api key]
    on:
        branch: master
    artifact: /.*(\.|\.s)nupkg/

artifacts:
- path: Out\
  name: App1
- path: '**\*.nupkg'

它工作得很好,但有一个问题:它似乎在构建过程中部署了两次。以下是 AppVeyor 日志的一部分:

Collecting artifacts...
Found artifact 'Out' matching 'Out' path
Found artifact 'Out\App1\Release\App1.6.0.3.nupkg' matching '**\*.nupkg' path
Uploading artifacts...
[1/2] App1.6.0.3.nupkg (164,127 bytes)...100%
[2/2] Out\App1\Release\App1.6.0.3.nupkg (164,127 bytes)...100%
Deploying using NuGet provider
Publishing App1.6.0.3.nupkg to https://www.nuget.org/api/v2/package...OK
Publishing App1.6.0.3.nupkg to https://www.nuget.org/api/v2/package...Skipped (A package with ID 'App1' and version '6.0.3' already exists and cannot be modified.)
No packages were pushed.

所以我登录 NuGet.org,我可以看到 App1.6.0.3 已成功发布。然而,在上面的日志中,同一个包被发布了两次,因此第二次发布被跳过,并以消息“我们没有推送包”结束。但是居然推送了一个包

可能是因为我在 environment 部分下有一个 matrix 配置,所以 AppVeyor 运行了 deploy 两次?如果是这样,如何告诉 AppVeyor 只部署一次?

经过一些实验,我找到了一个修复方法,即删除 build 部分下的 publish_nuget: true。此行将导致 AppVeyor 创建一个 nuget 包,并且 after_build 部分下的 dotnet pack Src\App1.csproj 命令也将创建一个 nuget 包。所以会在不同的位置生成两个相同的.nupkg文件,AppVeyor会找到这两个文件并将它们推送到nuget服务器。

结果:

build:
  project: '%solution_name%'

after_build:
  - dotnet pack Src\App1.csproj