blazor-lazy-loading icon indicating copy to clipboard operation
blazor-lazy-loading copied to clipboard

Linker adds unused dependencies as boot

Open isc30 opened this issue 4 years ago • 4 comments

The linker in Blazor WASM is including dependencies that aren't in use (in normal scenarios these would be stripped out by the compiler, which is what happens with the linker disabled (ok)).

When adding a reference (RCL project/nuget) to a project with Microsoft.AspNetCore.Components.WebAssembly.Build and BlazorWebAssemblyEnableLinking set to true, the linker will add the dependency project as a boot dependency inside blazor.boot.json even if it's not used at all.

If this reference is not used, the linker should detect it and not add it as a boot project. I suspect the problem is somewhere where we take the linker output and enumerate the blazor binaries based on it.

This issue doesn't happen with BlazorWebAssemblyEnableLinking disabled (the unused project is not even inside _framework/_bin).

To Reproduce

Please follow the steps to get this reproduced on your own repository. In order to check the bug, this minimal example repository with the bug can be used.

Properly Working Example: With no Linker

  1. Create a Blazor WASM project (host)
  2. Add <BlazorWebAssemblyEnableLinking>false</BlazorWebAssemblyEnableLinking>
  3. Create a RCL project (lib) with a Component and wwwroot/test.css as StaticWebAsset
  4. Reference lib from host and use the Component from it
  5. Build and Run
  6. The DLL of lib appears inside blazor.boot.json and gets downloaded during startup (ok)
  7. Navigate to _content/lib/test.css and see that the StaticWebAsset is available (ok)
  8. Remove the runtime usage of lib by not using the Component anymore so the compiler strips it out
  9. The DLL of the project is no longer inside blazor.boot.json and doesn't get downloaded during startup (ok)
  10. The StaticWebAsset _content/lib/test.css is still available (ok)

Buggy Example: With Linker enabled

  1. Use the project from the working example
  2. Change it to use <BlazorWebAssemblyEnableLinking>true</BlazorWebAssemblyEnableLinking>
  3. Reference lib from host and use the Component from it
  4. Build and Run
  5. The DLL of lib appears inside blazor.boot.json and gets downloaded during startup (ok)
  6. Navigate to _content/lib/test.css and see that the StaticWebAsset is available (ok)
  7. Remove the runtime usage of lib by not using the Component anymore so the compiler strips it out
  8. The DLL of the project is still inside blazor.boot.json and still gets downloaded during startup (fail)
  9. The StaticWebAsset _content/lib/test.css is still available (ok)

Further technical details

  • ASP.NET Core version: 3.2.0-rc1.20223.4
  • dotnet version: 3.1.201

Comments

This is a rather big bug. When including a NuGet package and using a small portion of it, the linker will still add every sub-reference, even if not used and the DLL could be skipped.

This should still preserve StaticWebAssets from the projects that don't need a runtime.

isc30 avatar May 26 '20 06:05 isc30

Official bug report: https://github.com/dotnet/aspnetcore/issues/22230

isc30 avatar May 26 '20 18:05 isc30

The official answer is that they don't support linking user assemblies so I need to find a way to avoid having module DLLs inside blazor.boot.json.

I can achieve this in two ways:

  • Marking the references as Private="false" so they get excluded from it
  • Editing the file after autogeneration and remove certain lines

In order to get a list of assemblies that shouldn't be included as part of the boot, I will need to create an MSBuild Task that does:

  1. Get all references
  2. Get all references from module projects
  3. Get all references not coming from module projects
  4. Return the references that come ONLY from the modules
  5. Mark them as Private="false"

isc30 avatar May 31 '20 22:05 isc30

Detecting the references that only affect Modules project is not trivial, I will just wait for the "linking user assemblies" feature to be available.

isc30 avatar Jun 01 '20 11:06 isc30

Very similar to my issue https://github.com/dotnet/aspnetcore/issues/25949

GTmAster avatar Sep 17 '20 12:09 GTmAster