[Build] Separate Resizetizer image processing from platform injection and add extensibility targets#34226
[Build] Separate Resizetizer image processing from platform injection and add extensibility targets#34226
Conversation
… extensibility targets Split the ResizetizeImages target into two targets: - ResizetizeImages: platform-agnostic image processing (validate, resize, convert) - _ResizetizeInjectPlatformItems: platform-specific output injection (BundleResource, LibraryResourceDirectories, ContentWithTargetPath, etc.) Add extensibility hook targets with DependsOnTargets properties: - _ResizetizerAfterImageProcessing (ResizetizerAfterImageProcessingTargets) - _ResizetizerAfterFontProcessing (ResizetizerAfterFontProcessingTargets) - _ResizetizerAfterAllProcessing (ResizetizerAfterAllProcessingTargets) - _ResizetizeInjectPlatformItems (ResizetizeInjectPlatformItemsTargets) Add optional custom platform targets import via ResizetizerCustomPlatformTargets property. Fixes #34222 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR refactors the Resizetizer build pipeline to separate platform-agnostic image processing from platform-specific item injection, and introduces new MSBuild hook targets/properties intended to make custom platform backends extensible without patching internal targets.
Changes:
- Adds hook targets for “after font processing”, “after image processing (before injection)”, and “after all processing”.
- Splits platform-specific output injection into a new
_ResizetizeInjectPlatformItemstarget that runs afterResizetizeImages. - Adds an optional
ResizetizerCustomPlatformTargetsimport for backend-provided targets.
| <!-- Extensibility target: runs after all resource processing is complete. | ||
| Custom backends can register targets via the ResizetizerAfterAllProcessingTargets property. --> | ||
| <Target Name="_ResizetizerAfterAllProcessing" | ||
| AfterTargets="ResizetizeImages;ProcessMauiFonts;ProcessMauiAssets" | ||
| DependsOnTargets="$(ResizetizerAfterAllProcessingTargets)" /> |
There was a problem hiding this comment.
_ResizetizerAfterAllProcessing is intended to run after all resource processing, but AfterTargets="ResizetizeImages;ProcessMauiFonts;ProcessMauiAssets" will schedule it after whichever of those targets runs first (the target will only execute once). Consider introducing an aggregate target that DependsOnTargets="ResizetizeImages;ProcessMauiFonts;ProcessMauiAssets" and then run _ResizetizerAfterAllProcessing after that aggregate, so the hook reliably runs after the full pipeline.
| <!-- Extensibility target: runs after all resource processing is complete. | |
| Custom backends can register targets via the ResizetizerAfterAllProcessingTargets property. --> | |
| <Target Name="_ResizetizerAfterAllProcessing" | |
| AfterTargets="ResizetizeImages;ProcessMauiFonts;ProcessMauiAssets" | |
| DependsOnTargets="$(ResizetizerAfterAllProcessingTargets)" /> | |
| <!-- Aggregate target to ensure all resource processing has completed. --> | |
| <Target Name="_ResizetizerAllResourceProcessing" | |
| DependsOnTargets="ResizetizeImages;ProcessMauiFonts;ProcessMauiAssets" /> | |
| <!-- Extensibility target: runs after all resource processing is complete. | |
| Custom backends can register targets via the ResizetizerAfterAllProcessingTargets property. --> | |
| <Target Name="_ResizetizerAfterAllProcessing" | |
| AfterTargets="_ResizetizerAllResourceProcessing" | |
| DependsOnTargets="$(ResizetizerAfterAllProcessingTargets)" /> |
| Or '$(_ResizetizerIsWindowsAppSdk)' == 'True' | ||
| Or '$(_ResizetizerIsWPFApp)' == 'True' | ||
| Or '$(_ResizetizerIsTizenApp)' == 'True')" | ||
| DependsOnTargets="$(ResizetizeInjectPlatformItemsTargets)"> |
There was a problem hiding this comment.
The new extensibility properties use the Resizetizer...Targets prefix (e.g., ResizetizerAfterImageProcessingTargets), but this target uses ResizetizeInjectPlatformItemsTargets (missing the 'r'). For a new public extension point, please align the property name with the other extensibility properties to avoid confusing custom backends and to match the target’s purpose.
| DependsOnTargets="$(ResizetizeInjectPlatformItemsTargets)"> | |
| DependsOnTargets="$(ResizetizerInjectPlatformItemsTargets)"> |
Note
Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!
Description
Fixes #34222
Part of #34099
This PR separates the Resizetizer's
ResizetizeImagestarget into two distinct concerns and adds official extensibility points for custom platform backends.Changes
1. Split
ResizetizeImagesinto processing + injection targetsResizetizeImagesnow only handles platform-agnostic image processing (validate, resize, convert, collect results, stamp file)_ResizetizeInjectPlatformItemsis a new target (AfterTargets="ResizetizeImages") that handles platform-specific output injection (BundleResource,LibraryResourceDirectories,ContentWithTargetPath, etc.)2. Add extensibility hook targets with
DependsOnTargetsproperties_ResizetizerAfterImageProcessingResizetizerAfterImageProcessingTargetsResizetizeImages, before_ResizetizeInjectPlatformItems_ResizetizerAfterFontProcessingResizetizerAfterFontProcessingTargetsProcessMauiFonts_ResizetizerAfterAllProcessingResizetizerAfterAllProcessingTargetsResizetizeImages,ProcessMauiFonts,ProcessMauiAssets_ResizetizeInjectPlatformItemsResizetizeInjectPlatformItemsTargetsResizetizeImagesCustom backends can register their targets via properties:
3. Optional custom platform targets import
Backends can set
ResizetizerCustomPlatformTargetsto import a custom targets file:Impact