Skip to content

Commit 7b76256

Browse files
committed
Add more properties controlling service reference code generation
- `$(OpenApiGenerateBeforeCompile)` controls if targets run before compile targets - #4924 - also correct multiple invocations when project has multiple target frameworks - `$(OpenApiBuildReferencedProjects)` controls whether `@(OpenApiProjectReference)` items build automatically - #6582 also: - add symbols for Microsoft.Extensions.ApiDescription.Client task assembly - #10508 - unconditionally run `OpenApiGetDocuments` target in referenced projects - corrects compilation in design-time builds - no longer uses `@(ProjectReferenceWithConfiguration)`; referenced project chooses all property values nits: - don't remove `$(TargetFrameworks)` when invoking `OpenApiGetDocuments` target (not necessary) - consolidate into a single `$(GenerateOpenApiReferenceCodeDependsOn)` property - rename task assembly and namespaces in Microsoft.Extensions.ApiDesription.Client to match the project - allow `OpenApiGetDocuments` targets to run in parallel if `$(BuildInParallel)` is enabled - remove `$(OpenApiDefaultOutputDirectory)` normalization; never concatenated with anything else - remove dangling `GenerateServiceFileReferenceCode` names
1 parent 69139b5 commit 7b76256

12 files changed

Lines changed: 78 additions & 50 deletions

eng/ProjectReferences.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity.Specification.Tests" ProjectPath="$(RepoRoot)src\Identity\Specification.Tests\src\Microsoft.AspNetCore.Identity.Specification.Tests.csproj" />
99
<ProjectReferenceProvider Include="Microsoft.Web.Xdt.Extensions" ProjectPath="$(RepoRoot)src\SiteExtensions\Microsoft.Web.Xdt.Extensions\src\Microsoft.Web.Xdt.Extensions.csproj" />
1010
<ProjectReferenceProvider Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat" ProjectPath="$(RepoRoot)src\Tools\FirstRunCertGenerator\src\Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj" />
11-
<ProjectReferenceProvider Include="Microsoft.Extensions.ApiDescription.Tasks" ProjectPath="$(RepoRoot)src\Mvc\Extensions.ApiDescription.Client\src\Microsoft.Extensions.ApiDescription.Client.csproj" />
11+
<ProjectReferenceProvider Include="Microsoft.Extensions.ApiDescription.Client" ProjectPath="$(RepoRoot)src\Mvc\Extensions.ApiDescription.Client\src\Microsoft.Extensions.ApiDescription.Client.csproj" />
1212
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Specification.Tests" ProjectPath="$(RepoRoot)src\SignalR\server\Specification.Tests\src\Microsoft.AspNetCore.SignalR.Specification.Tests.csproj" />
1313
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Blazor.Build" ProjectPath="$(RepoRoot)src\Components\Blazor\Build\src\Microsoft.AspNetCore.Blazor.Build.csproj" />
1414
<ProjectReferenceProvider Include="Microsoft.AspNetCore" ProjectPath="$(RepoRoot)src\DefaultBuilder\src\Microsoft.AspNetCore.csproj" RefProjectPath="$(RepoRoot)src\DefaultBuilder\ref\Microsoft.AspNetCore.csproj" />

src/Mvc/Extensions.ApiDescription.Client/src/CSharpIdentifier.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
// Copied from
88
// https://github.com/aspnet/AspNetCore-Tooling/blob/master/src/Razor/src/Microsoft.AspNetCore.Razor.Language/CSharpIdentifier.cs
9-
namespace Microsoft.Extensions.ApiDescription.Tasks
9+
namespace Microsoft.Extensions.ApiDescription.Client
1010
{
1111
internal static class CSharpIdentifier
1212
{

src/Mvc/Extensions.ApiDescription.Client/src/GetCurrentItems.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using Microsoft.Build.Framework;
55
using Microsoft.Build.Utilities;
66

7-
namespace Microsoft.Extensions.ApiDescription.Tasks
7+
namespace Microsoft.Extensions.ApiDescription.Client
88
{
99
/// <summary>
1010
/// Restore <see cref="ITaskItem"/>s from given property value.

src/Mvc/Extensions.ApiDescription.Client/src/GetFileReferenceMetadata.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using Microsoft.Build.Framework;
88
using Microsoft.Build.Utilities;
99

10-
namespace Microsoft.Extensions.ApiDescription.Tasks
10+
namespace Microsoft.Extensions.ApiDescription.Client
1111
{
1212
/// <summary>
1313
/// Adds or corrects ClassName, FirstForGenerator, Namespace, and OutputPath metadata in OpenApiReference items.

src/Mvc/Extensions.ApiDescription.Client/src/MetadataSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using Microsoft.Build.Framework;
77
using Microsoft.Build.Utilities;
88

9-
namespace Microsoft.Extensions.ApiDescription.Tasks
9+
namespace Microsoft.Extensions.ApiDescription.Client
1010
{
1111
/// <summary>
1212
/// Utility methods to serialize and deserialize <see cref="ITaskItem"/> metadata.

src/Mvc/Extensions.ApiDescription.Client/src/Microsoft.Extensions.ApiDescription.Client.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,19 @@
66
<!-- Do not complain about lack of lib folder. -->
77
<NoPackageAnalysis>true</NoPackageAnalysis>
88

9-
<AssemblyName>Microsoft.Extensions.ApiDescription.Tasks</AssemblyName>
109
<Description>MSBuild tasks and targets for code generation</Description>
1110
<IncludeBuildOutput>false</IncludeBuildOutput>
1211
<IncludeSource>false</IncludeSource>
13-
<IncludeSymbols>false</IncludeSymbols>
1412
<NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
1513
<PackageId>$(MSBuildProjectName)</PackageId>
1614
<PackageTags>Build Tasks;MSBuild;Swagger;Open API;code generation; Web API client</PackageTags>
1715
<IsShippingPackage>true</IsShippingPackage>
1816
<PackageVersion>$(ExperimentalPackageVersion)</PackageVersion>
19-
<RootNamespace>$(AssemblyName)</RootNamespace>
2017
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
2118
<VerifyVersion>false</VerifyVersion>
2219
<VersionPrefix>$(ExperimentalVersionPrefix)</VersionPrefix>
2320
<VersionSuffix>$(ExperimentalVersionSuffix)</VersionSuffix>
21+
2422
<HasReferenceAssembly>false</HasReferenceAssembly>
2523
</PropertyGroup>
2624

src/Mvc/Extensions.ApiDescription.Client/src/Microsoft.Extensions.ApiDescription.Client.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<files>
2020
<file src="build\*" target="build" />
2121
<file src="buildMultiTargeting\*" target="buildMultiTargeting" />
22-
<file src="$baseOutputPath$\$configuration$\net461\Microsoft.Extensions.ApiDescription.Tasks.*" target="tasks\net461" />
23-
<file src="$baseOutputPath$\$configuration$\netstandard2.0\Microsoft.Extensions.ApiDescription.Tasks.*" target="tasks\netstandard2.0" />
22+
<file src="$baseOutputPath$\$configuration$\net461\Microsoft.Extensions.ApiDescription.Client.*" target="tasks\net461" />
23+
<file src="$baseOutputPath$\$configuration$\netstandard2.0\Microsoft.Extensions.ApiDescription.Client.*" target="tasks\netstandard2.0" />
2424
</files>
2525
</package>

src/Mvc/Extensions.ApiDescription.Client/src/Properties/Resources.Designer.cs

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Mvc/Extensions.ApiDescription.Client/src/build/Microsoft.Extensions.ApiDescription.Client.props

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,58 @@
11
<?xml version="1.0" encoding="utf-8" standalone="no"?>
22
<Project>
33
<PropertyGroup>
4-
<_ApiDescriptionTasksAssemblyTarget
5-
Condition="'$(MSBuildRuntimeType)' == 'Core'">netstandard2.0</_ApiDescriptionTasksAssemblyTarget>
6-
<_ApiDescriptionTasksAssemblyTarget
7-
Condition="'$(MSBuildRuntimeType)' != 'Core'">net461</_ApiDescriptionTasksAssemblyTarget>
8-
<_ApiDescriptionTasksAssemblyPath>$(MSBuildThisFileDirectory)/../tasks/$(_ApiDescriptionTasksAssemblyTarget)/Microsoft.Extensions.ApiDescription.Tasks.dll</_ApiDescriptionTasksAssemblyPath>
9-
<_ApiDescriptionTasksAssemblyTarget />
4+
<_ApiDescriptionClientAssemblyTarget
5+
Condition="'$(MSBuildRuntimeType)' == 'Core'">netstandard2.0</_ApiDescriptionClientAssemblyTarget>
6+
<_ApiDescriptionClientAssemblyTarget
7+
Condition="'$(MSBuildRuntimeType)' != 'Core'">net461</_ApiDescriptionClientAssemblyTarget>
8+
<_ApiDescriptionClientAssemblyPath>$(MSBuildThisFileDirectory)/../tasks/$(_ApiDescriptionClientAssemblyTarget)/Microsoft.Extensions.ApiDescription.Client.dll</_ApiDescriptionClientAssemblyPath>
9+
<_ApiDescriptionClientAssemblyTarget />
1010
</PropertyGroup>
11-
<UsingTask TaskName="GetCurrentItems" AssemblyFile="$(_ApiDescriptionTasksAssemblyPath)" />
12-
<UsingTask TaskName="GetFileReferenceMetadata" AssemblyFile="$(_ApiDescriptionTasksAssemblyPath)" />
11+
<UsingTask TaskName="GetCurrentItems" AssemblyFile="$(_ApiDescriptionClientAssemblyPath)" />
12+
<UsingTask TaskName="GetFileReferenceMetadata" AssemblyFile="$(_ApiDescriptionClientAssemblyPath)" />
1313

1414
<!--
1515
Settings users may update as they see fit.
1616
-->
1717
<PropertyGroup>
18+
<!--
19+
Options added to the code generator command line by default. Provides the default %(Options) metadata of
20+
@(OpenApiReference) and @(OpenApiProjectReference) items.
21+
-->
1822
<OpenApiDefaultGeneratorOptions Condition="'$(OpenApiDefaultGeneratorOptions)' == ''"></OpenApiDefaultGeneratorOptions>
1923

2024
<!--
21-
If 'true', will generate code for OpenApiReference items during design-time builds. Otherwise, generate code only
22-
for output files that do not yet exist during design-time builds.
25+
If 'true' (the default), generate code for @(OpenApiReference) and @(OpenApiProjectReference) items before the
26+
BeforeCompile target.
27+
28+
If 'false', the GenerateOpenApiReferenceCode target is not part of the build (by default) but can run when
29+
explicitly referenced. That is, the target may be invoked from the command line or tied in through another target.
30+
-->
31+
<OpenApiGenerateBeforeCompile Condition="'$(OpenApiGenerateBeforeCompile)' == ''">true</OpenApiGenerateBeforeCompile>
32+
33+
<!--
34+
If 'true' (the default), generate code for @(OpenApiReference) and @(OpenApiProjectReference) items during
35+
design-time builds. Otherwise, generate code only during a full build.
2336
-->
2437
<OpenApiGenerateAtDesignTime Condition="'$(OpenApiGenerateAtDesignTime)' == ''">true</OpenApiGenerateAtDesignTime>
2538

2639
<!--
27-
$(OpenApiDefaultOutputDirectory) value is interpreted relative to the project folder, unless already an
28-
absolute path.
40+
If 'true' (the default), build projects referenced in @(OpenApiProjectReference) items before retrieving that
41+
project's Open API documents list (or generating code). Recommend setting this to 'false' when the referenced
42+
projects do not share target framework values (avoiding build errors and / or warnings).
43+
44+
If 'false', ensure the referenced projects build before this one in the solution or through other means. IDEs may
45+
be confused about the project dependency graph in this case.
46+
-->
47+
<OpenApiBuildReferencedProjects Condition="'$(OpenApiBuildReferencedProjects)' == ''">true</OpenApiBuildReferencedProjects>
48+
49+
<!--
50+
Default folder to place code generated from Open API documents. Value is interpreted relative to the project
51+
folder, unless already an absolute path. Part of the default %(OutputPath) metadata of @(OpenApiReference) and
52+
@(OpenApiProjectReference) items.
2953
-->
3054
<OpenApiDefaultOutputDirectory
3155
Condition="'$(OpenApiDefaultOutputDirectory)' == ''">$(BaseIntermediateOutputPath)</OpenApiDefaultOutputDirectory>
32-
<OpenApiDefaultOutputDirectory>$([MSBuild]::EnsureTrailingSlash('$(OpenApiDefaultOutputDirectory)'))</OpenApiDefaultOutputDirectory>
3356
</PropertyGroup>
3457

3558
<!--

src/Mvc/Extensions.ApiDescription.Client/src/build/Microsoft.Extensions.ApiDescription.Client.targets

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,17 @@
33
<!-- Internal settings. Not intended for customization. -->
44
<PropertyGroup>
55
<GenerateOpenApiReferenceCodeDependsOn>
6+
_GenerateErrorsForOldItems;
7+
_CreateOpenApiReferenceItemsForOpenApiProjectReferences;
68
_GetMetadataForOpenApiReferences;
79
_GenerateOpenApiReferenceCode;
810
_CreateCompileItemsForOpenApiReferences
911
</GenerateOpenApiReferenceCodeDependsOn>
10-
<GenerateServiceFileReferenceCodeDependsOn>
11-
_GenerateErrorsForOldItems;
12-
_CreateOpenApiReferenceItemsForOpenApiProjectReferences;
13-
GenerateOpenApiReferenceCode
14-
</GenerateServiceFileReferenceCodeDependsOn>
1512
</PropertyGroup>
1613

1714
<!-- OpenApiProjectReference support. -->
1815

19-
<ItemGroup>
16+
<ItemGroup Condition=" '$(OpenApiBuildReferencedProjects)' == 'true' ">
2017
<!--
2118
Do not change %(ReferenceOutputAssembly) if project contains duplicate @(ProjectReference) and
2219
@(OpenApiProjectReference) items.
@@ -30,19 +27,16 @@
3027
</ProjectReference>
3128
</ItemGroup>
3229

33-
<Target Name="_CreateOpenApiReferenceItemsForOpenApiProjectReferences"
34-
AfterTargets="ResolveProjectReferences"
35-
Condition="'$(DesignTimeBuild)' != 'true' AND '$(BuildingProject)' == 'true'">
30+
<Target Name="_CreateOpenApiReferenceItemsForOpenApiProjectReferences" DependsOnTargets="ResolveProjectReferences">
3631
<ItemGroup>
3732
<_Temporary Remove="@(_Temporary)" />
3833
</ItemGroup>
3934

4035
<MSBuild Targets="OpenApiGetDocuments"
41-
Projects="@(ProjectReferenceWithConfiguration)"
42-
Condition="'%(ProjectReferenceWithConfiguration.OpenApiReference)' == 'true'"
43-
Properties="%(ProjectReferenceWithConfiguration.SetConfiguration); %(ProjectReferenceWithConfiguration.SetPlatform); %(ProjectReferenceWithConfiguration.SetTargetFramework)"
36+
BuildInParallel="$(BuildInParallel)"
37+
Projects="@(OpenApiProjectReference)"
4438
RebaseOutputs="true"
45-
RemoveProperties="%(ProjectReferenceWithConfiguration.GlobalPropertiesToRemove);TargetFrameworks;RuntimeIdentifier">
39+
RemoveProperties="Configuration;Platform;RuntimeIdentifier;TargetFramework;TargetFrameworks">
4640
<Output TaskParameter="TargetOutputs" ItemName="_Temporary" />
4741
</MSBuild>
4842

@@ -85,10 +79,9 @@
8579
Condition="$(OpenApiGenerateAtDesignTime) OR ('$(DesignTimeBuild)' != 'true' AND '$(BuildingProject)' == 'true')"
8680
Inputs="@(OpenApiReference)"
8781
Outputs="%(OutputPath)">
88-
<MSBuild BuildInParallel="$(BuildInParallel)"
89-
Projects="$(MSBuildProjectFullPath)"
82+
<MSBuild Projects="$(MSBuildProjectFullPath)"
83+
BuildInParallel="$(BuildInParallel)"
9084
Properties="GeneratorTargetPath=%(OpenApiReference.OutputPath);GeneratorTarget=Generate%(CodeGenerator);GeneratorMetadata=%(SerializedMetadata)"
91-
RemoveProperties="TargetFrameworks"
9285
Targets="_InnerGenerateOpenApiReferenceCode" />
9386
</Target>
9487

@@ -133,17 +126,22 @@
133126
</ItemGroup>
134127
</Target>
135128

136-
<Target Name="GenerateOpenApiReferenceCode" DependsOnTargets="$(GenerateOpenApiReferenceCodeDependsOn)" />
137-
138-
<!-- Tie above code generation steps into the build. -->
129+
<!-- Inform users of breaking changes in this file and Microsoft.Extensions.ApiDescription.Client.props. -->
139130

140131
<Target Name="_GenerateErrorsForOldItems">
141132
<Error Condition="'@(ServiceProjectReference)' != ''" Text="ServiceProjectReference items are no longer supported." />
142133
<Error Condition="'@(ServiceUriReference)' != ''" Text="ServiceUriReference items are no longer supported." />
143134
<Error Condition="'@(ServiceFileReference)' != ''" Text="ServiceFileReference items are no longer supported." />
144135
</Target>
145136

146-
<Target Name="GenerateServiceFileReferenceCode"
137+
<!-- Main code generation entry point. -->
138+
139+
<Target Name="GenerateOpenApiReferenceCode" DependsOnTargets="$(GenerateOpenApiReferenceCodeDependsOn)" />
140+
141+
<!-- Unless this is an inner build or default timing is disabled, tie code generation into the build. -->
142+
143+
<Target Name="_TieInGenerateOpenApiReferenceCode"
147144
BeforeTargets="BeforeCompile"
148-
DependsOnTargets="$(GenerateServiceFileReferenceCodeDependsOn)" />
145+
Condition=" '$(OpenApiGenerateBeforeCompile)' == 'true' AND ('$(TargetFramework)' == '' OR '$(TargetFrameworks)' == '') "
146+
DependsOnTargets="GenerateOpenApiReferenceCode" />
149147
</Project>

0 commit comments

Comments
 (0)