You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
F# assemblies contain embedded resources for signature and optimization data that can significantly increase assembly size. These resource names are templates that get combined with the actual assembly name. To reduce the size of trimmed F# assemblies, we need to automatically remove these metadata resources during IL linking:
(the asterisk is not there, this is where the project name goes)
The full set of F#-compiler-generated prefixes currently is:
FSharpSignatureData.*
FSharpSignatureDataB.*
FSharpSignatureCompressedData.*
FSharpSignatureCompressedDataB.*
Study the existing embedded resource pattern: Look at how it generates embedded resources programmatically.
Understand resource name construction: The patterns are templates. You need to append the actual assembly name to create the full resource names (e.g., "FSharpOptimizationData." + assemblyName).
Create the MSBuild task:
Follow the structure of existing tasks in src/FSharp.Build/
Generate XML content in memory
Create TaskItem with the XML content as an embedded resource
Set appropriate metadata like LogicalName="ILLink.Substitutions.xml"
Use action="remove" for all resource entries
Wire into the build system:
Add the target to run during normal compilation
Use BeforeTargets="CoreCompile" to ensure it runs at the right time
This approach generates the substitution file as an embedded resource during compilation, ensuring F# metadata resources are removed during IL linking to reduce the size of trimmed F# assemblies.
The text was updated successfully, but these errors were encountered:
Background
F# assemblies contain embedded resources for signature and optimization data that can significantly increase assembly size. These resource names are templates that get combined with the actual assembly name. To reduce the size of trimmed F# assemblies, we need to automatically remove these metadata resources during IL linking:
(the asterisk is not there, this is where the project name goes)
The full set of F#-compiler-generated prefixes currently is:
FSharpSignatureData.*
FSharpSignatureDataB.*
FSharpSignatureCompressedData.*
FSharpSignatureCompressedDataB.*
FSharpOptimizationData.*
FSharpOptimizationDataB.*
FSharpOptimizationCompressedData.*
FSharpOptimizationCompressedDataB.*
FSharpOptimizationInfo.*
FSharpSignatureInfo.*
Files to Modify
1. Create new MSBuild task:
src/FSharp.Build/GenerateILLinkSubstitutions.fs
Create a new task that follows the pattern of existing embedded resource generators. Study how it creates
TaskItem
objects for embedded resources.The task should:
Microsoft.Build.Utilities.Task
EmbeddedResource
itemExample of what the generated XML should contain (using actual assembly name):
2. Update
src/FSharp.Build/FSharp.Build.fsproj
Add the new task file to the compilation list: 3
3. Add target to
src/FSharp.Build/Microsoft.FSharp.NetSdk.targets
Create a new target that runs during every compilation. Looking at the existing props file structure, add:
Implementation Steps
Study the existing embedded resource pattern: Look at how it generates embedded resources programmatically.
Understand resource name construction: The patterns are templates. You need to append the actual assembly name to create the full resource names (e.g.,
"FSharpOptimizationData." + assemblyName
).Create the MSBuild task:
src/FSharp.Build/
TaskItem
with the XML content as an embedded resourceLogicalName="ILLink.Substitutions.xml"
action="remove"
for all resource entriesWire into the build system:
BeforeTargets="CoreCompile"
to ensure it runs at the right time** Create tests for the behavior.
Look at the folder https://github.com/dotnet/fsharp/tree/main/tests/AheadOfTime/Trimming to see existing trimming tests.
You will need to adjust the test setup to make it use freshly built FSharp.Build.dll as well as the adjusted props and targets.
Notes
This approach generates the substitution file as an embedded resource during compilation, ensuring F# metadata resources are removed during IL linking to reduce the size of trimmed F# assemblies.
The text was updated successfully, but these errors were encountered: