为 OpenApiReference 元素自定义 MSBuild 目标

Customize MSBuild targets for the OpenApiReference element

我想自定义 OpenApiReference 元素目标。具体来说,我想在 OpenApiReference 元素定义的目标之前 运行 一个自定义目标。我该怎么做?

假设配置如下:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <OpenApiReference Include="openapi.json" CodeGenerator="NSwagCSharp" Namespace="IntegrationService">
      <Options>/GenerateDtoTypes:false /GenerateClientInterfaces:true</Options>
      <ClassName>IntegrationServiceClient</ClassName>
    </OpenApiReference>
  </ItemGroup>
</Project>

查看 MS 源代码我能够按如下方式解决需求:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup>
    <OpenApiGenerateCodeOnBuild>false</OpenApiGenerateCodeOnBuild>
    <OpenApiGenerateCodeAtDesignTime>false</OpenApiGenerateCodeAtDesignTime>
  </PropertyGroup>

  <ItemGroup>
    <OpenApiReference Include="openapi.json" CodeGenerator="NSwagCSharp" Namespace="IntegrationService">
      <Options>/GenerateDtoTypes:false /GenerateClientInterfaces:true</Options>
      <ClassName>IntegrationServiceClient</ClassName>
    </OpenApiReference>
  </ItemGroup>

  <Target Name="DeleteServiceClient" >
    <Message Text="------ Custom target: Removing existing generated service client for $(ProjectName)" Importance="high"/>
    <Delete Files="$(ProjectDir)$(BaseIntermediateOutputPath)/openapiClient.cs" />
  </Target>

  <Target Name="GenerateServiceClient" DependsOnTargets="DeleteServiceClient;GenerateOpenApiCode" BeforeTargets="BeforeCompile"/>
</Project>

参考文献:

https://github.com/dotnet/aspnetcore/blob/v3.1.10/src/Tools/Extensions.ApiDescription.Client/src/build/Microsoft.Extensions.ApiDescription.Client.targets https://github.com/dotnet/aspnetcore/blob/v3.1.10/src/Tools/Extensions.ApiDescription.Client/src/build/Microsoft.Extensions.ApiDescription.Client.props https://github.com/dotnet/aspnetcore/blob/v3.1.10/src/Tools/Extensions.ApiDescription.Client/src/buildMultiTargeting/Microsoft.Extensions.ApiDescription.Client.targets