Skip to content

Commit e2707e1

Browse files
authored
* Work around dotnet/msbuild#3274 - #38547 - handle a ApiDescription.Client code generator that uses `%(OutputPath)` as a directory - see also <https://stackoverflow.com/questions/48868060/can-a-task-itemgroup-glob-files> - add tests for Microsoft.Extensions.ApiDescription.Client.targets - make `TemporaryCSharpProject` slightly extensible - allow project additions to `TemporaryDirectory` after `Create()` nits: - add comment about batching w/ a code generator that uses `%(OutputPath)` as a directory - fix `%(SourceDocument)` metadata - primarily for back-tracing in detailed / binary logs - remove useless `%(OutputPathExtension)` metadata; use `%(Extension)` - remove useless `ConsoleClient` test asset project * Handle symbolic links in `TemporaryDirectory` - e.g. on macOS /var/folders resolves to /private/var/folders * !fixup!
1 parent cf03093 commit e2707e1

File tree

9 files changed

+726
-123
lines changed

9 files changed

+726
-123
lines changed

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

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484

8585
<Target Name="_InnerGenerateOpenApiCode" DependsOnTargets="_GetCurrentOpenApiReference;$(GeneratorTarget)" />
8686

87+
<!-- Note target will **always** execute when generator uses the OutputPath as a directory. -->
8788
<Target Name="_GenerateOpenApiCode"
8889
Condition="$(OpenApiGenerateCodeAtDesignTime) OR ('$(DesignTimeBuild)' != 'true' AND '$(BuildingProject)' == 'true')"
8990
Inputs="@(OpenApiReference)"
@@ -100,44 +101,57 @@
100101
<ItemGroup>
101102
<_Files Remove="@(_Files)" />
102103
<_Files Include="@(OpenApiReference -> '%(OutputPath)')"
103-
Condition="$([System.IO.File]::Exists('%(OpenApiReference.OutputPath)'))">
104-
<OutputPathExtension>$([System.IO.Path]::GetExtension('%(OpenApiReference.OutputPath)'))</OutputPathExtension>
105-
</_Files>
104+
Condition="$([System.IO.File]::Exists('%(OpenApiReference.OutputPath)'))" />
106105
<_Directories Remove="@(_Directories)" />
107106
<_Directories Include="@(OpenApiReference -> '%(OutputPath)')"
108107
Condition="Exists('%(OpenApiReference.OutputPath)') AND ! $([System.IO.File]::Exists('%(OpenApiReference.OutputPath)'))" />
108+
</ItemGroup>
109+
110+
<ItemGroup>
111+
<_Files SourceDocument="%(OriginalItemSpec)" RemoveMetadata="OriginalItemSpec" />
112+
<_Directories SourceDocument="%(OriginalItemSpec)" RemoveMetadata="OriginalItemSpec" />
113+
</ItemGroup>
109114

115+
<ItemGroup>
110116
<!-- If OutputPath is a file, add it directly to relevant items. -->
111117
<TypeScriptCompile Include="@(_Files)"
112118
Exclude="@(TypeScriptCompile)"
113-
Condition="'%(_Files.OutputPathExtension)' == '.ts' OR '%(_Files.OutputPathExtension)' == '.tsx'">
114-
<SourceDocument>%(_Files.FullPath)</SourceDocument>
115-
</TypeScriptCompile>
119+
Condition="'%(_Files.Extension)' == '.ts' OR '%(_Files.Extension)' == '.tsx'" />
116120

117121
<Compile Include="@(_Files)"
118122
Exclude="@(Compile)"
119-
Condition="'$(DefaultLanguageSourceExtension)' != '.ts' AND '%(_Files.OutputPathExtension)' == '$(DefaultLanguageSourceExtension)'">
120-
<SourceDocument>%(OpenApiReference.FullPath)</SourceDocument>
121-
</Compile>
123+
Condition="'$(DefaultLanguageSourceExtension)' != '.ts' AND '%(_Files.Extension)' == '$(DefaultLanguageSourceExtension)'" />
124+
</ItemGroup>
122125

123-
<!-- Otherwise, add all descendant files with the expected extension. -->
124-
<TypeScriptCompile Include="@(_Directories -> '%(Identity)/**/*.ts;%(Identity)/**/*.tsx')"
125-
Exclude="@(TypeScriptCompile)">
126-
<SourceDocument>%(_Directories.FullPath)</SourceDocument>
127-
</TypeScriptCompile>
126+
<!--
127+
Otherwise, add all descendant files with the expected extension. Glob into _Directories before updating
128+
TypeScriptCompile or Compile items. See <https://github.com/dotnet/msbuild/issues/3274> and workaround in
129+
<https://stackoverflow.com/questions/48868060/can-a-task-itemgroup-glob-files>. Unfortunately, this workaround
130+
loses SourceDocument and other metadata.
131+
-->
132+
<PropertyGroup>
133+
<_TypeScriptCompileItemsFromDirectories>@(_Directories -> '%(Identity)/**/*.ts;%(Identity)/**/*.tsx')</_TypeScriptCompileItemsFromDirectories>
134+
<_CompileItemsFromDirectories>@(_Directories -> '%(Identity)/**/*$(DefaultLanguageSourceExtension)')</_CompileItemsFromDirectories>
135+
</PropertyGroup>
128136

129-
<Compile Include="@(_Directories -> '%(Identity)/**/*.$(DefaultLanguageSourceExtension)')"
137+
<ItemGroup>
138+
<TypeScriptCompile Include="$(_TypeScriptCompileItemsFromDirectories)" Exclude="@(TypeScriptCompile)" />
139+
140+
<Compile Include="$(_CompileItemsFromDirectories)"
130141
Exclude="@(Compile)"
131-
Condition="'$(DefaultLanguageSourceExtension)' != '.ts'">
132-
<SourceDocument>%(_Directories.FullPath)</SourceDocument>
133-
</Compile>
142+
Condition="'$(DefaultLanguageSourceExtension)' != '.ts'" />
134143

135-
<FileWrites Exclude="@(FileWrites)"
136-
Include="@(_Files);@(_Directories -> '%(Identity)/**/*.ts;%(Identity)/**/*.tsx;%(Identity)/**/*.$(DefaultLanguageSourceExtension)')" />
144+
<FileWrites Include="@(_Files);$(_TypeScriptCompileItemsFromDirectories);$(_CompileItemsFromDirectories)"
145+
Exclude="@(FileWrites)" />
137146

138147
<_Files Remove="@(_Files)" />
139148
<_Directories Remove="@(_Directories)" />
140149
</ItemGroup>
150+
151+
<PropertyGroup>
152+
<_TypeScriptCompileItemsFromDirectories />
153+
<_CompileItemsFromDirectories />
154+
</PropertyGroup>
141155
</Target>
142156

143157
<!-- Inform users of breaking changes in this file and Microsoft.Extensions.ApiDescription.Client.props. -->
Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
<Project Sdk="Microsoft.NET.Sdk">
2-
32
<PropertyGroup>
43
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
54
<DefaultItemExcludes>$(DefaultItemExcludes);TestProjects\**\*</DefaultItemExcludes>
65
<TestGroupName>ApiDescriptionClientTests</TestGroupName>
76
</PropertyGroup>
87

98
<ItemGroup>
10-
<Content Include="$(MSBuildThisFileDirectory)..\src\build\**\*" CopyToOutputDirectory="PreserveNewest" LinkBase="build" />
11-
<Content Include="$(MSBuildThisFileDirectory)..\src\buildMultiTargeting\**\*" CopyToOutputDirectory="PreserveNewest" LinkBase="buildMultiTargeting" />
12-
<Content Include="TestProjects\**\*" CopyToOutputDirectory="PreserveNewest" />
9+
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
10+
<_Parameter1>TargetFramework</_Parameter1>
11+
<_Parameter2>$(TargetFramework)</_Parameter2>
12+
</AssemblyAttribute>
1313

14-
<Reference Include="Microsoft.Extensions.ApiDescription.Client" />
15-
</ItemGroup>
14+
<Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="ProcessHelpers" />
15+
<Compile Include="$(SharedSourceRoot)\CommandLineUtils\Utilities\DotNetMuxer.cs"
16+
Link="ProcessHelpers\DotNetMuxer.cs" />
17+
<Compile Include="$(ToolSharedSourceRoot)TestHelpers\Temporary*.cs" LinkBase="TestHelpers" />
1618

17-
<Target Name="CleanTestProjects" BeforeTargets="CoreCompile">
18-
<RemoveDir Directories="$(TargetDir)TestProjects" />
19-
</Target>
19+
<Content Include="..\src\build\**\*" LinkBase="build" />
20+
<Content Include="..\src\buildMultiTargeting\**\*" LinkBase="buildMultiTargeting" />
21+
<Content Include="TestProjects\**\*" />
2022

23+
<Reference Include="Microsoft.Extensions.ApiDescription.Client" />
24+
</ItemGroup>
2125
</Project>

0 commit comments

Comments
 (0)