Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,9 @@ Copyright (c) .NET Foundation. All rights reserved.
</ItemGroup>
</Target>

<Target Name="_ResolveWasmOutputs" DependsOnTargets="ResolveReferences;PrepareResourceNames;ComputeIntermediateSatelliteAssemblies;_ResolveWasmConfiguration;_WasmNativeForBuild">
<!-- Resolve and classify build asset candidates.
This target always runs to ensure candidate items are populated for downstream consumers. -->
<Target Name="_ComputeWasmBuildCandidates" DependsOnTargets="ResolveReferences;PrepareResourceNames;ComputeIntermediateSatelliteAssemblies;_ResolveWasmConfiguration;_WasmNativeForBuild">
<PropertyGroup>
<_WasmNativeAssetFileNames>;@(WasmNativeAsset->'%(FileName)%(Extension)');@(WasmAssembliesFinal->'%(FileName)%(Extension)');</_WasmNativeAssetFileNames>
<_WasmIntermediateAssemblyFileNames Condition="@(WasmAssembliesFinal->Count()) != 0">;@(IntermediateAssembly->'%(FileName)%(Extension)');</_WasmIntermediateAssemblyFileNames>
Expand Down Expand Up @@ -355,10 +357,69 @@ Copyright (c) .NET Foundation. All rights reserved.
<_WasmBuildTmpWebcilPath>$([MSBuild]::NormalizeDirectory($(IntermediateOutputPath), 'tmp-webcil'))</_WasmBuildTmpWebcilPath>
</PropertyGroup>

<ConvertDllsToWebcil Candidates="@(_BuildAssetsCandidates)" IntermediateOutputPath="$(_WasmBuildTmpWebcilPath)" OutputPath="$(_WasmBuildWebcilPath)" IsEnabled="$(_WasmEnableWebcil)">
<Output TaskParameter="WebcilCandidates" ItemName="_WebcilAssetsCandidates" />
<!-- Identify DLL candidates that need webcil conversion, separate culture from non-culture
DLLs, and compute their expected output paths for use as Outputs in the incremental
_ConvertBuildDllsToWebcil target. Culture and non-culture DLLs are separated into
distinct item groups to avoid MSBuild batching errors on metadata (like RelatedAsset)
that only culture items define. -->
<ItemGroup Condition="'$(_WasmEnableWebcil)' == 'true'">
<_WasmDllBuildCandidates Include="@(_BuildAssetsCandidates)" Condition="'%(Extension)' == '.dll'" />
<_WasmDllBuildCandidatesNonCulture Include="@(_WasmDllBuildCandidates)" Condition="'%(AssetTraitName)' != 'Culture'" />
<_WasmDllBuildCandidatesCulture Include="@(_WasmDllBuildCandidates)" Condition="'%(AssetTraitName)' == 'Culture'" />
<_WasmExpectedWebcilOutputs Include="@(_WasmDllBuildCandidatesNonCulture->'$(_WasmBuildWebcilPath)%(FileName).wasm')" />
<_WasmExpectedWebcilOutputs Include="@(_WasmDllBuildCandidatesCulture->'$(_WasmBuildWebcilPath)%(AssetTraitValue)/%(FileName).wasm')" />
</ItemGroup>
</Target>

<!-- Convert DLL assemblies to webcil format.
This target is incremental: when all input DLLs are older than their corresponding
webcil outputs, the entire target is skipped, saving the conversion task overhead.
The task also has internal per-file timestamp checks as a secondary optimization. -->
<Target Name="_ConvertBuildDllsToWebcil"
DependsOnTargets="_ComputeWasmBuildCandidates"
Condition="'$(_WasmEnableWebcil)' == 'true'"
Inputs="@(_WasmDllBuildCandidates);$(MSBuildProjectFullPath)"
Outputs="@(_WasmExpectedWebcilOutputs)">

<ConvertDllsToWebcil Candidates="@(_WasmDllBuildCandidates)" IntermediateOutputPath="$(_WasmBuildTmpWebcilPath)" OutputPath="$(_WasmBuildWebcilPath)" IsEnabled="$(_WasmEnableWebcil)">
<Output TaskParameter="FileWrites" ItemName="FileWrites" />
</ConvertDllsToWebcil>
</Target>

<!-- Resolve webcil candidate items and define static web assets for the build.
This target always runs because it populates item groups consumed by downstream targets.
It reconstructs the webcil candidate items from _BuildAssetsCandidates using the same
path logic as the ConvertDllsToWebcil task, so items are correct whether the conversion
target ran or was skipped due to incrementalism. -->
<Target Name="_ResolveWasmOutputs" DependsOnTargets="_ComputeWasmBuildCandidates;_ConvertBuildDllsToWebcil">

<!-- When webcil is enabled, transform DLL candidates to their webcil output paths and fix
metadata. Non-culture and culture DLLs use separate intermediate items to avoid MSBuild
batching errors on metadata (like RelatedAsset) that only culture items define. -->
<ItemGroup Condition="'$(_WasmEnableWebcil)' == 'true'">
<_WasmWebcilConvertedNonCulture Include="@(_WasmDllBuildCandidatesNonCulture->'$(_WasmBuildWebcilPath)%(FileName).wasm')">
<RelativePath>$([System.IO.Path]::ChangeExtension(%(RelativePath), '.wasm'))</RelativePath>
<OriginalItemSpec>$(_WasmBuildWebcilPath)%(FileName).wasm</OriginalItemSpec>
</_WasmWebcilConvertedNonCulture>
<_WasmWebcilConvertedCulture Include="@(_WasmDllBuildCandidatesCulture->'$(_WasmBuildWebcilPath)%(AssetTraitValue)/%(FileName).wasm')">
<RelativePath>$([System.IO.Path]::ChangeExtension(%(RelativePath), '.wasm'))</RelativePath>
<OriginalItemSpec>$(_WasmBuildWebcilPath)%(AssetTraitValue)/%(FileName).wasm</OriginalItemSpec>
<RelatedAsset>$([System.IO.Path]::ChangeExtension(%(RelatedAsset), '.wasm'))</RelatedAsset>
</_WasmWebcilConvertedCulture>

<!-- Combine non-DLL pass-through candidates with webcil-converted candidates -->
<_WebcilAssetsCandidates Include="@(_BuildAssetsCandidates)" Condition="'%(Extension)' != '.dll'" />
<_WebcilAssetsCandidates Include="@(_WasmWebcilConvertedNonCulture)" />
<_WebcilAssetsCandidates Include="@(_WasmWebcilConvertedCulture)" />

<!-- Track webcil files for clean operations even when the conversion target was skipped -->
<FileWrites Include="@(_WasmExpectedWebcilOutputs)" />
</ItemGroup>

<!-- When webcil is disabled, candidates pass through unchanged -->
<ItemGroup Condition="'$(_WasmEnableWebcil)' != 'true'">
<_WebcilAssetsCandidates Include="@(_BuildAssetsCandidates)" />
</ItemGroup>

<ItemGroup>
<!-- Set per-item ContentRoot so each asset's Identity matches its actual file on disk -->
Expand Down Expand Up @@ -429,7 +490,9 @@ Copyright (c) .NET Foundation. All rights reserved.
</ItemGroup>
</Target>

<Target Name="_GenerateBuildWasmBootJson" DependsOnTargets="$(GenerateBuildWasmBootJsonDependsOn)">
<!-- Resolve endpoints and inputs needed for boot JSON generation.
This target always runs to ensure endpoint items are populated for downstream consumers. -->
<Target Name="_ResolveBuildWasmBootJsonEndpoints" DependsOnTargets="$(GenerateBuildWasmBootJsonDependsOn)">
<PropertyGroup>
<_WasmBuildBootJsonPath>$(IntermediateOutputPath)$(_WasmBootConfigFileName)</_WasmBuildBootJsonPath>
<_WasmBuildApplicationEnvironmentName>$(WasmApplicationEnvironmentName)</_WasmBuildApplicationEnvironmentName>
Expand Down Expand Up @@ -483,6 +546,15 @@ Copyright (c) .NET Foundation. All rights reserved.
>
<Output TaskParameter="ResolvedEndpoints" ItemName="_WasmResolvedEndpoints" />
</ResolveFingerprintedStaticWebAssetEndpointsForAssets>
</Target>

<!-- Write the boot JSON file. Supports MSBuild incrementalism: skipped when all inputs
are older than the output, avoiding the expensive GenerateWasmBootJson computation
on no-op rebuilds. -->
<Target Name="_WriteBuildWasmBootJsonFile"
DependsOnTargets="_ResolveBuildWasmBootJsonEndpoints"
Inputs="@(IntermediateAssembly);@(WasmStaticWebAsset);@(_WasmJsModuleCandidatesForBuild);@(_WasmFilesToIncludeInFileSystemStaticWebAsset);@(_WasmJsConfigStaticWebAsset);@(_WasmDotnetJsForBuild);@(WasmBootConfigExtension);$(ProjectRuntimeConfigFilePath);$(MSBuildProjectFullPath)"
Outputs="$(_WasmBuildBootJsonPath)">

<GenerateWasmBootJson
AssemblyPath="@(IntermediateAssembly)"
Expand Down Expand Up @@ -523,6 +595,11 @@ Copyright (c) .NET Foundation. All rights reserved.
<ItemGroup>
<FileWrites Include="$(_WasmBuildBootJsonPath)" />
</ItemGroup>
</Target>

<!-- Define the boot config file as a static web asset and create endpoints.
This target always runs to ensure items are populated for _AddWasmStaticWebAssets. -->
<Target Name="_GenerateBuildWasmBootJson" DependsOnTargets="_WriteBuildWasmBootJsonFile">

<ItemGroup>
<_WasmBuildBootConfigCandidate
Expand Down Expand Up @@ -873,7 +950,8 @@ Copyright (c) .NET Foundation. All rights reserved.

</Target>

<Target Name="GeneratePublishWasmBootJson" DependsOnTargets="$(GeneratePublishWasmBootJsonDependsOn)">
<!-- Resolve inputs needed for publish boot JSON generation. -->
<Target Name="_ResolvePublishWasmBootJsonInputs" DependsOnTargets="$(GeneratePublishWasmBootJsonDependsOn)">
<PropertyGroup>
<_WasmPublishApplicationEnvironmentName>$(WasmApplicationEnvironmentName)</_WasmPublishApplicationEnvironmentName>
</PropertyGroup>
Expand Down Expand Up @@ -906,6 +984,14 @@ Copyright (c) .NET Foundation. All rights reserved.
>
<Output TaskParameter="ResolvedEndpoints" ItemName="_WasmResolvedEndpointsForPublish" />
</ResolveFingerprintedStaticWebAssetEndpointsForAssets>
</Target>

<!-- Write the publish boot JSON file. Supports MSBuild incrementalism: skipped when all
inputs are older than the output. -->
<Target Name="GeneratePublishWasmBootJson"
DependsOnTargets="_ResolvePublishWasmBootJsonInputs"
Inputs="@(IntermediateAssembly);@(_WasmPublishAsset);@(_WasmJsModuleCandidatesForPublish);@(_WasmPublishConfigFile);@(_WasmDotnetJsForPublish);@(WasmBootConfigExtension);$(ProjectRuntimeConfigFilePath);$(MSBuildProjectFullPath)"
Outputs="$(IntermediateOutputPath)$(_WasmPublishBootConfigFileName)">

<GenerateWasmBootJson
AssemblyPath="@(IntermediateAssembly)"
Expand Down
Loading