Skip to content

Commit 8111fcf

Browse files
committed
Include a .targets file in NuGet packages which will select the correct analyzer assembly depending on which Roslyn version will be used to compile.
1 parent 91b38de commit 8111fcf

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<Project>
2+
<!-- Reads the version of the compiler APIs that are currently being used in order to pick the correct Roslyn components. -->
3+
<Target Name="_{TargetPrefix}ResolveRoslynApiMajorVersion"
4+
Condition="'$(_RoslynApiMajorVersion)' == ''">
5+
<GetAssemblyIdentity AssemblyFiles="$(RoslynTargetsPath)\Microsoft.Build.Tasks.CodeAnalysis.dll">
6+
<Output TaskParameter="Assemblies" ItemName="_CodeAnalysisIdentity" />
7+
</GetAssemblyIdentity>
8+
9+
<PropertyGroup>
10+
<_RoslynApiMajorVersion>$([System.Version]::Parse(%(_CodeAnalysisIdentity.Version)).Major)</_RoslynApiMajorVersion>
11+
</PropertyGroup>
12+
</Target>
13+
14+
<Target Name="_{TargetPrefix}RoslynComponentMultiTargeting"
15+
Condition="'$(SupportsRoslynComponentVersioning)' != 'true'"
16+
AfterTargets="ResolveAssemblyReferences"
17+
DependsOnTargets="_{TargetPrefix}ResolveRoslynApiMajorVersion">
18+
<ItemGroup>
19+
<!-- clear _CurrentAnalyzer, in case some other target is using it. -->
20+
<_CurrentAnalyzer Remove="@(_CurrentAnalyzer)" />
21+
<_CurrentAnalyzer Include="@(Analyzer)" Condition="'%(Analyzer.NuGetPackageId)' == '{NuGetPackageId}'" />
22+
</ItemGroup>
23+
24+
<ItemGroup Condition="$([System.Int32]::Parse($(_RoslynApiMajorVersion))) &lt; 4">
25+
<!-- Remove our analyzers targeting roslyn4.x -->
26+
<Analyzer Remove="@(_CurrentAnalyzer)"
27+
Condition="$([System.String]::Copy('%(_CurrentAnalyzer.Identity)').IndexOf('roslyn4')) &gt;= 0"/>
28+
</ItemGroup>
29+
30+
<ItemGroup Condition="$([System.Int32]::Parse($(_RoslynApiMajorVersion))) &gt;= 4">
31+
<!-- Remove our analyzers targeting roslyn3.x -->
32+
<Analyzer Remove="@(_CurrentAnalyzer)"
33+
Condition="$([System.String]::Copy('%(_CurrentAnalyzer.Identity)').IndexOf('roslyn3')) &gt;= 0"/>
34+
</ItemGroup>
35+
36+
<ItemGroup Condition="'$({DisableSourceGeneratorPropertyName})' == 'true'">
37+
<!-- Remove all our analyzers -->
38+
<Analyzer Remove="@(_CurrentAnalyzer)" />
39+
</ItemGroup>
40+
</Target>
41+
</Project>

eng/packaging.targets

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,42 @@
150150
</ItemGroup>
151151
</Target>
152152

153+
<PropertyGroup>
154+
<MultiTargetRoslynComponentTargetsFileIntermediatePath>$(IntermediateOutputPath)MultiTargetRoslynComponent.targets</MultiTargetRoslynComponentTargetsFileIntermediatePath>
155+
<IncludeMultiTargetRoslynComponentTargets Condition="'$(IncludeMultiTargetRoslynComponentTargets)' == ''">true</IncludeMultiTargetRoslynComponentTargets>
156+
</PropertyGroup>
157+
158+
<!-- In packages that contain Analyzers, include a .targets file that will select the correct
159+
analyzer given the version of Roslyn being used to compile the project. -->
160+
<Target Name="IncludeMultiTargetRoslynComponentTargetsInPackage"
161+
AfterTargets="IncludeAnalyzersInPackage"
162+
Condition="'@(AnalyzerReference)' != '' and '$(IncludeMultiTargetRoslynComponentTargets)' == 'true'"
163+
DependsOnTargets="GenerateMultiTargetRoslynComponentTargetsFile">
164+
<ItemGroup>
165+
<Content Include="$(MultiTargetRoslynComponentTargetsFileIntermediatePath)"
166+
PackagePath="build\$(PackageId).targets"
167+
Pack="True" />
168+
</ItemGroup>
169+
</Target>
170+
171+
<Target Name="GenerateMultiTargetRoslynComponentTargetsFile"
172+
Inputs="$(MSBuildProjectFullPath)"
173+
Outputs="$(MultiTargetRoslynComponentTargetsFileIntermediatePath)">
174+
<PropertyGroup>
175+
<_MultiTargetRoslynComponentTargetsTemplate>$(MSBuildThisFileDirectory)MultiTargetRoslynComponent.targets.template</_MultiTargetRoslynComponentTargetsTemplate>
176+
<_MultiTargetRoslynComponentTargetPrefix>$(PackageId.Replace('.', '_'))</_MultiTargetRoslynComponentTargetPrefix>
177+
<_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName>Disable$(PackageId.Replace('.', ''))SourceGenerator</_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName>
178+
<_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName>$(_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName.Replace('Abstractions', ''))</_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName>
179+
</PropertyGroup>
180+
181+
<WriteLinesToFile File="$(MultiTargetRoslynComponentTargetsFileIntermediatePath)"
182+
Lines="$([System.IO.File]::ReadAllText('$(_MultiTargetRoslynComponentTargetsTemplate)')
183+
.Replace('{TargetPrefix}', '$(_MultiTargetRoslynComponentTargetPrefix)')
184+
.Replace('{NuGetPackageId}', '$(PackageId)')
185+
.Replace('{DisableSourceGeneratorPropertyName}', '$(_MultiTargetRoslynComponentDisableSourceGeneratorPropertyName)'))"
186+
Overwrite="true" />
187+
</Target>
188+
153189
<!-- Include a netstandard compat error if the project targets both .NETStandard and
154190
.NETCoreApp. This prohibits users to consume packages on an older .NETCoreApp version
155191
than the minimum supported one. -->

0 commit comments

Comments
 (0)