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 >
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 -> '%(FullPath)')"
35- Outputs =" $(IntermediateOutputPath)ilrepack.txt"
36- Returns =" @(MergedAssemblies)"
37- Condition =" Exists(@(IntermediateAssembly -> '%(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 - > '%(FullPath)') "
95+ Outputs = " $(IntermediateOutputPath)ilrepack.txt "
96+ Returns = " @(MergedAssemblies) "
97+ Condition = " Exists(@(IntermediateAssembly - > '%(FullPath)')) And '$(ILRepack)' == 'true' " >
98+
99+ < ItemGroup >
100+ <MergedAssemblies Include =" @(ILRepackCandidate - > Distinct( ))" />
55101 </ItemGroup >
56102 <ItemGroup >
57103 <ReferenceCopyLocalDirs Include =" @(ReferenceCopyLocalPaths -> '%(RootDir)%(Directory)')" />
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 -> '$(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 -> '$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')"
154+ Condition =" Exists('$(MSBuildProjectDirectory)\$(OutputPath)%(Filename)%(Extension)')" />
155+ </Target >
156+
157+ </Project >
0 commit comments