为 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
我想自定义 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