Skip to content

Commit 383a0a2

Browse files
committed
Sync ILRepack targets from 🐱 catbag
1 parent 4930bc2 commit 383a0a2

File tree

2 files changed

+101
-28
lines changed

2 files changed

+101
-28
lines changed

.netconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,8 @@
150150
sha = 33000c0c4ab4eb4e0e142fa54515b811a189d55c
151151
etag = 013a47739e348f06891f37c45164478cca149854e6cd5c5158e6f073f852b61a
152152
weak
153+
[file "src/ILRepack.targets"]
154+
url = https://github.com/devlooped/catbag/blob/main/MSBuild/ILRepack.targets
155+
sha = 04f82bd24a0c01503e33d3fe45d6de1935e0d2eb
156+
etag = 5d3c3772b11e579ae9cbde8731ff3f9bbd97c166f7b159e03530a3ac8bd8c0bf
157+
weak

src/ILRepack.targets

Lines changed: 96 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1-
<Project>
1+
<Project>
22
<!--
33
ILRepack.targets provides MSBuild integration for ILRepack, allowing merging of assemblies into a single output.
44
55
Extension Points:
66
- Property 'ILRepack': Set to 'true' to enable ILRepack (default: true in Release, false otherwise).
7-
- Item 'ILRepackInclude': list of assembly filenames to explicitly include in merging.
8-
- Item 'ILRepackExclude': list of assembly filenames to exclude from merging.
9-
- Item 'ILRepackPreserve': Assemblies that should not be deleted after merging, even if merged.
10-
-->
7+
- Items:
8+
* ILRepackInclude: assemblies to include
9+
* ILRepackExclude: assemblies to exclude
10+
* ILRepackPreserve: assemblies to preserve after merging (otherwise, they are deleted from output)
1111
12+
Items can have metadata 'StartsWith' set to 'true' to indicate prefix matching rather than
13+
exact matching.
14+
-->
15+
1216
<PropertyGroup>
1317
<ILRepack Condition="'$(ILRepack)' == '' and '$(Configuration)' == 'Release'">true</ILRepack>
1418
<ILRepack Condition="'$(ILRepack)' == ''">false</ILRepack>
@@ -30,28 +34,70 @@
3034
<Message Importance="high" Text="Installed dotnet-ilrepack v$(ILRepackInstalledOutput)" Condition="$(ExitCode) != '0'" />
3135
</Target>
3236

33-
<Target Name="ILRepack" AfterTargets="CoreCompile" BeforeTargets="CopyFilesToOutputDirectory"
34-
Inputs="@(IntermediateAssembly -&gt; '%(FullPath)')"
35-
Outputs="$(IntermediateOutputPath)ilrepack.txt"
36-
Returns="@(MergedAssemblies)"
37-
Condition="Exists(@(IntermediateAssembly -&gt; '%(FullPath)')) And '$(ILRepack)' == 'true'">
37+
<Target Name="ILRepackPrepare">
38+
<ItemGroup>
39+
<ILRepackIncludeWildcard Include="@(ILRepackInclude -> WithMetadataValue('StartsWith', 'true'))"/>
40+
<ILRepackIncludeExact Include="@(ILRepackInclude)" Exclude="@(ILRepackIncludeWildcard)" />
41+
<ILRepackExcludeWildcard Include="@(ILRepackExclude -> WithMetadataValue('StartsWith', 'true'))" />
42+
<ILRepackExcludeExact Include="@(ILRepackExclude)" Exclude="@(ILRepackExcludeWildcard)" />
43+
<ILRepackPreserveWildcard Include="@(ILRepackPreserve -> WithMetadataValue('StartsWith', 'true'))"/>
44+
<ILRepackPreserveExact Include="@(ILRepackPreserve)" Exclude="@(ILRepackPreserveWildcard)" />
45+
</ItemGroup>
46+
</Target>
47+
48+
<Target Name="ILRepackFilterIncludeStartsWith" DependsOnTargets="ILRepackPrepare;CoreCompile"
49+
Inputs="@(ILRepackIncludeWildcard)" Outputs="|%(ILRepackIncludeWildcard.Identity)|">
50+
<PropertyGroup>
51+
<LocalFilter>%(ILRepackIncludeWildcard.Identity)</LocalFilter>
52+
</PropertyGroup>
53+
<ItemGroup>
54+
<ILRepackCandidate Include="@(ReferenceCopyLocalPaths)" Condition="
55+
'%(Extension)' == '.dll' And
56+
!$([MSBuild]::ValueOrDefault('%(FileName)', '').EndsWith('.resources', StringComparison.OrdinalIgnoreCase)) And
57+
$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('$(LocalFilter)'))" />
58+
</ItemGroup>
59+
</Target>
60+
61+
<Target Name="ILRepackFilterExcludeStartsWith" DependsOnTargets="ILRepackFilterIncludeStartsWith"
62+
Inputs="@(ILRepackExcludeWildcard)" Outputs="|%(ILRepackExcludeWildcard.Identity)|">
63+
<PropertyGroup>
64+
<LocalFilter>%(ILRepackExcludeWildcard.Identity)</LocalFilter>
65+
</PropertyGroup>
66+
<ItemGroup>
67+
<ILRepackCandidate Remove="@(ILRepackCandidate)" Condition="
68+
$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('$(LocalFilter)'))" />
69+
</ItemGroup>
70+
</Target>
71+
72+
<Target Name="ILRepackFilterInclude" BeforeTargets="ILRepack" DependsOnTargets="ILRepackFilterExcludeStartsWith">
73+
<PropertyGroup>
74+
<ILRepackInclude>;@(ILRepackIncludeExact, ';');</ILRepackInclude>
75+
</PropertyGroup>
76+
<ItemGroup>
77+
<ILRepackCandidate Include="@(ReferenceCopyLocalPaths)" Condition="
78+
'%(Extension)' == '.dll' And
79+
!$([MSBuild]::ValueOrDefault('%(FileName)', '').EndsWith('.resources', StringComparison.OrdinalIgnoreCase)) And
80+
$(ILRepackInclude.Contains(';%(FileName);'))" />
81+
</ItemGroup>
82+
</Target>
83+
84+
<Target Name="ILRepackFilterExclude" BeforeTargets="ILRepack" DependsOnTargets="CoreCompile">
3885
<PropertyGroup>
39-
<ILRepackInclude>;@(ILRepackInclude, ';');</ILRepackInclude>
40-
<ILRepackExclude>;@(ILRepackExclude, ';');</ILRepackExclude>
86+
<ILRepackExclude>;@(ILRepackExcludeExact, ';');</ILRepackExclude>
4187
</PropertyGroup>
4288
<ItemGroup>
43-
<ReferenceCopyLocalAssemblies Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)' == '.dll'
44-
And !$([MSBuild]::ValueOrDefault('%(FileName)', '').EndsWith('.resources', StringComparison.OrdinalIgnoreCase))" />
45-
46-
<!-- Default to never merging analyzer, C# or system assemblies -->
47-
<MergedAssemblies Include="@(ReferenceCopyLocalAssemblies)" Condition="
48-
!$(ILRepackExclude.Contains(';%(FileName);')) And
49-
!$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('Microsoft.CodeAnalysis', StringComparison.OrdinalIgnoreCase)) And
50-
!$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('Microsoft.CSharp', StringComparison.OrdinalIgnoreCase)) And
51-
!$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('System.', StringComparison.OrdinalIgnoreCase))"
52-
/>
53-
<!-- Brings in explicitly opted-in assemblies -->
54-
<MergedAssemblies Include="@(ReferenceCopyLocalAssemblies)" Condition="$(ILRepackInclude.Contains(';%(FileName);'))" />
89+
<ILRepackCandidate Remove="@(ILRepackCandidate)" Condition="$(ILRepackExclude.Contains(';%(FileName);'))" />
90+
</ItemGroup>
91+
</Target>
92+
93+
<Target Name="ILRepack" AfterTargets="CoreCompile" BeforeTargets="CopyFilesToOutputDirectory"
94+
Inputs="@(IntermediateAssembly -&gt; '%(FullPath)')"
95+
Outputs="$(IntermediateOutputPath)ilrepack.txt"
96+
Returns="@(MergedAssemblies)"
97+
Condition="Exists(@(IntermediateAssembly -&gt; '%(FullPath)')) And '$(ILRepack)' == 'true'">
98+
99+
<ItemGroup>
100+
<MergedAssemblies Include="@(ILRepackCandidate -&gt; Distinct())" />
55101
</ItemGroup>
56102
<ItemGroup>
57103
<ReferenceCopyLocalDirs Include="@(ReferenceCopyLocalPaths -&gt; '%(RootDir)%(Directory)')" />
@@ -80,10 +126,32 @@
80126
<Touch AlwaysCreate="true" Files="$(IntermediateOutputPath)ilrepack.txt" Condition="'$(ExitCode)' == '0'" />
81127
<Error Text="$(ILRepackOutput)" Condition="'$(ExitCode)' != '0' And '$(ContinueOnError)' != 'true'" />
82128
<ItemGroup>
83-
<MergedAssembliesToRemove Include="@(MergedAssemblies)" />
84-
<MergedAssembliesToRemove Remove="@(ILRepackPreserve)" />
129+
<ILRepackCleanup Include="@(MergedAssemblies)" />
85130
</ItemGroup>
86-
<Delete Files="@(MergedAssembliesToRemove -&gt; '$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')" Condition="Exists('$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')" />
87131
</Target>
88132

89-
</Project>
133+
<Target Name="ILRepackPreserveStartsWith" DependsOnTargets="ILRepack"
134+
Inputs="@(ILRepackPreserveWildcard)" Outputs="|%(ILRepackPreserveWildcard.Identity)|">
135+
<PropertyGroup>
136+
<LocalFilter>%(ILRepackPreserveWildcard.Identity)</LocalFilter>
137+
</PropertyGroup>
138+
<ItemGroup>
139+
<ILRepackCleanup Remove="@(ILRepackCleanup)" Condition="$([MSBuild]::ValueOrDefault('%(FileName)', '').StartsWith('$(LocalFilter)'))" />
140+
</ItemGroup>
141+
</Target>
142+
143+
<Target Name="ILRepackPreserve" DependsOnTargets="ILRepack">
144+
<PropertyGroup>
145+
<ILRepackPreserve>;@(ILRepackPreserveExact, ';');</ILRepackPreserve>
146+
</PropertyGroup>
147+
<ItemGroup>
148+
<ILRepackCleanup Remove="@(ILRepackCleanup)" Condition="$(ILRepackPreserve.Contains(';%(FileName);'))" />
149+
</ItemGroup>
150+
</Target>
151+
152+
<Target Name="ILRepackCleanup" AfterTargets="ILRepack" DependsOnTargets="ILRepackPreserveStartsWith;ILRepackPreserve" Returns="@(ILRepackCleanup)">
153+
<Delete Files="@(ILRepackCleanup -&gt; '$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')"
154+
Condition="Exists('$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')" />
155+
</Target>
156+
157+
</Project>

0 commit comments

Comments
 (0)