[flutter_tools] Track asset transformer dependencies for hot reload (Reland #187947)#188808
Conversation
… reload" (flutter#188751) This reverts commit c3d417f.
There was a problem hiding this comment.
Code Review
This pull request updates the Flutter build system to support tracking and resolving dependencies generated by asset transformers. It enables parsing relative paths in depfiles relative to a base directory, tracks these dependencies in AssetTransformer and DevelopmentAssetTransformer, and monitors them in DevFS to trigger hot reloads when they are invalidated. Feedback on these changes suggests adding the --depfile argument to the transformer command, using absolute paths when filtering dependencies, and filtering out empty paths in DepfileService to prevent tracking the base directory as a dependency.
| final command = <String>[ | ||
| _dartBinaryPath, | ||
| 'run', | ||
| transformer.package, | ||
| '--input=${asset.path}', | ||
| '--output=${output.path}', | ||
| ...transformer.args, | ||
| ]; |
There was a problem hiding this comment.
The PR description states that the asset transformer subprocess is passed a --depfile flag to register additional input dependencies. However, the constructed command list does not include the --depfile argument. If the transformer expects this flag to know where to write the depfile, it will not generate one, and dependency tracking will fail.\n\nConsider adding '--depfile=${output.path}.d' to the command arguments to match the described behavior.
| final command = <String>[ | |
| _dartBinaryPath, | |
| 'run', | |
| transformer.package, | |
| '--input=${asset.path}', | |
| '--output=${output.path}', | |
| ...transformer.args, | |
| ]; | |
| final command = <String>[ | |
| _dartBinaryPath, | |
| 'run', | |
| transformer.package, | |
| '--input=${asset.path}', | |
| '--output=${output.path}', | |
| '--depfile=${output.path}.d', | |
| ...transformer.args, | |
| ]; |
| final String tempDirPath = tempDirectory.path; | ||
| final List<File> filteredDependencies = allDependencies | ||
| .where((File file) => !_fileSystem.path.isWithin(tempDirPath, file.path)) | ||
| .toList(); |
There was a problem hiding this comment.
If file.path is a relative path (which can happen if workingDirectory is relative or baseDirectory is null during parsing), comparing it directly with the absolute tempDirPath using isWithin may fail to correctly identify files inside the temporary directory.\n\nUsing file.absolute.path ensures that both paths are absolute, making the isWithin check robust and reliable.
| final String tempDirPath = tempDirectory.path; | |
| final List<File> filteredDependencies = allDependencies | |
| .where((File file) => !_fileSystem.path.isWithin(tempDirPath, file.path)) | |
| .toList(); | |
| final String tempDirPath = tempDirectory.path; | |
| final List<File> filteredDependencies = allDependencies | |
| .where((File file) => !_fileSystem.path.isWithin(tempDirPath, file.absolute.path)) | |
| .toList(); |
| // be resilient to the outputs of other tools which write or user edits to depfiles. | ||
| .toSet() | ||
| // Normalize the path before creating a file object. | ||
| .map((String path) => _fileSystem.file(_fileSystem.path.normalize(path))) | ||
| .map((String path) { |
There was a problem hiding this comment.
If the depfile contains empty lines or trailing spaces, split('\n') and trim() can produce empty strings. If an empty string is passed to the path resolver, _fileSystem.path.isRelative(path) will be true, and it will resolve to baseDirectory.path. This causes the base directory itself to be tracked as a dependency, which can trigger unnecessary hot reloads whenever any file in the project changes.\n\nFiltering out empty paths before mapping them to File objects prevents this issue.
// be resilient to the outputs of other tools which write or user edits to depfiles.
.toSet()
.where((String path) => path.isNotEmpty)
// Normalize the path before creating a file object.
.map((String path) {…12135) Manual roll Flutter from ca9f874f5284 to 6995038d96ef (44 revisions) Manual roll requested by [email protected] flutter/flutter@ca9f874...6995038 2026-07-03 [email protected] Roll Fuchsia Linux SDK from sx_eN0J_f2BV6jqjW... to Jr08vyeibMSv3Oxst... (flutter/flutter#188946) 2026-07-03 [email protected] Roll Packages from 420e135 to 2fbe873 (1 revision) (flutter/flutter#188945) 2026-07-03 [email protected] Roll Dart SDK from 786212a2ce0d to 1f9a08ce0638 (4 revisions) (flutter/flutter#188944) 2026-07-03 [email protected] Roll Skia from 5358ab75b840 to 919956953af6 (7 revisions) (flutter/flutter#188943) 2026-07-02 [email protected] [Windows] Keep regular windows in place when another is activated (flutter/flutter#188016) 2026-07-02 [email protected] [flutter_tools] Provide guided message when iOS/macOS build fails due to low minimum version (flutter/flutter#188812) 2026-07-02 [email protected] [Flutter GPU] Load a ShaderLibrary from shader bundle bytes (flutter/flutter#188596) 2026-07-02 [email protected] [tool] Enable record_use experiment by default on all channels (flutter/flutter#188887) 2026-07-02 [email protected] Roll Packages from e742106 to 420e135 (13 revisions) (flutter/flutter#188916) 2026-07-02 [email protected] Roll Fuchsia Linux SDK from I2h2eXk06RrA3pIG2... to sx_eN0J_f2BV6jqjW... (flutter/flutter#188915) 2026-07-02 [email protected] Clarify layout callback debug flag docs (flutter/flutter#186879) 2026-07-02 [email protected] Roll Skia from 0c4faca350cc to 5358ab75b840 (2 revisions) (flutter/flutter#188899) 2026-07-02 [email protected] Roll Dart SDK from e47361c7fe9a to 786212a2ce0d (2 revisions) (flutter/flutter#188898) 2026-07-01 [email protected] Roll Skia from 0fc8ba72e802 to 0c4faca350cc (2 revisions) (flutter/flutter#188886) 2026-07-01 [email protected] Hide draft PRs from the triage list (flutter/flutter#188885) 2026-07-01 [email protected] Stricten isSemantics and matchesSemantics children mismatch check (flutter/flutter#188827) 2026-07-01 [email protected] [AGP 9] Support Enabling Built-in Kotlin (flutter/flutter#188543) 2026-07-01 [email protected] Roll Skia from d19e557ac317 to 0fc8ba72e802 (4 revisions) (flutter/flutter#188879) 2026-07-01 [email protected] [ci] Increase test timeout for Mac_x64 build_tests shards (flutter/flutter#188804) 2026-07-01 [email protected] Roll Skia from bd4ae38ca3bb to d19e557ac317 (1 revision) (flutter/flutter#188865) 2026-07-01 [email protected] Roll Dart SDK from 26d723eb89af to e47361c7fe9a (5 revisions) (flutter/flutter#188864) 2026-07-01 [email protected] Update triage links for material_ui and cupertino_ui --> Design triage (flutter/flutter#188567) 2026-07-01 [email protected] [Impeller] Share a single ContextGLES among all PlaygroundImplGLES (flutter/flutter#188080) 2026-07-01 [email protected] Use null-aware elements in dev/devicelab/lib/integration_tests.dart (flutter/flutter#187852) 2026-07-01 [email protected] Roll Packages from 274ed3e to e742106 (18 revisions) (flutter/flutter#188863) 2026-07-01 [email protected] Add android 17 to embedding (flutter/flutter#187965) 2026-07-01 [email protected] Adds semantics role check to isSemantics and matchesSemantics (flutter/flutter#188825) 2026-07-01 [email protected] Roll Dart SDK from e1bdb9ce3327 to 26d723eb89af (3 revisions) (flutter/flutter#188795) 2026-07-01 [email protected] [web] Apply autocapitalize to text editing elements (flutter/flutter#188351) 2026-07-01 [email protected] Roll Fuchsia Linux SDK from RymJjIj7dd5vQ3Cnh... to I2h2eXk06RrA3pIG2... (flutter/flutter#188852) 2026-07-01 [email protected] [Impeller] Compute dispatch takes 3D workgroup counts and honors the shader local_size (flutter/flutter#188601) 2026-07-01 [email protected] Improve stylus support on linux (flutter/flutter#186831) 2026-07-01 [email protected] Resolve issue Catch am start failures with 'Error type' and prevent hang (flutter/flutter#187196) 2026-07-01 [email protected] Roll Skia from ef178c9898af to bd4ae38ca3bb (3 revisions) (flutter/flutter#188834) 2026-07-01 [email protected] Roll Skia from 3ac99be47229 to ef178c9898af (3 revisions) (flutter/flutter#188831) 2026-07-01 [email protected] Add a macosArm64Only feature flag (flutter/flutter#188598) 2026-07-01 [email protected] Roll Skia from 15302f1625b2 to 3ac99be47229 (1 revision) (flutter/flutter#188819) 2026-07-01 [email protected] [flutter_tools] Track asset transformer dependencies for hot reload (Reland #187947) (flutter/flutter#188808) 2026-06-30 [email protected] Add TapRegion samples (flutter/flutter#188685) 2026-06-30 [email protected] Print a warning in `flutter doctor` when running on Intel Macs (flutter/flutter#188760) 2026-06-30 [email protected] [framework] Keep scrollable semantics role stable (flutter/flutter#187963) 2026-06-30 [email protected] feat(skills): Add shepherd-prs skill for managing approved external contributor PRs (flutter/flutter#188534) 2026-06-30 [email protected] Roll Skia from 71947c4110b0 to 15302f1625b2 (17 revisions) (flutter/flutter#188815) 2026-06-30 [email protected] [Tool] Run re-entrant upgrade in original CWD (flutter/flutter#188794) ...
…lutter#12135) Manual roll Flutter from ca9f874f5284 to 6995038d96ef (44 revisions) Manual roll requested by [email protected] flutter/flutter@ca9f874...6995038 2026-07-03 [email protected] Roll Fuchsia Linux SDK from sx_eN0J_f2BV6jqjW... to Jr08vyeibMSv3Oxst... (flutter/flutter#188946) 2026-07-03 [email protected] Roll Packages from 420e135 to 2fbe873 (1 revision) (flutter/flutter#188945) 2026-07-03 [email protected] Roll Dart SDK from 786212a2ce0d to 1f9a08ce0638 (4 revisions) (flutter/flutter#188944) 2026-07-03 [email protected] Roll Skia from 5358ab75b840 to 919956953af6 (7 revisions) (flutter/flutter#188943) 2026-07-02 [email protected] [Windows] Keep regular windows in place when another is activated (flutter/flutter#188016) 2026-07-02 [email protected] [flutter_tools] Provide guided message when iOS/macOS build fails due to low minimum version (flutter/flutter#188812) 2026-07-02 [email protected] [Flutter GPU] Load a ShaderLibrary from shader bundle bytes (flutter/flutter#188596) 2026-07-02 [email protected] [tool] Enable record_use experiment by default on all channels (flutter/flutter#188887) 2026-07-02 [email protected] Roll Packages from e742106 to 420e135 (13 revisions) (flutter/flutter#188916) 2026-07-02 [email protected] Roll Fuchsia Linux SDK from I2h2eXk06RrA3pIG2... to sx_eN0J_f2BV6jqjW... (flutter/flutter#188915) 2026-07-02 [email protected] Clarify layout callback debug flag docs (flutter/flutter#186879) 2026-07-02 [email protected] Roll Skia from 0c4faca350cc to 5358ab75b840 (2 revisions) (flutter/flutter#188899) 2026-07-02 [email protected] Roll Dart SDK from e47361c7fe9a to 786212a2ce0d (2 revisions) (flutter/flutter#188898) 2026-07-01 [email protected] Roll Skia from 0fc8ba72e802 to 0c4faca350cc (2 revisions) (flutter/flutter#188886) 2026-07-01 [email protected] Hide draft PRs from the triage list (flutter/flutter#188885) 2026-07-01 [email protected] Stricten isSemantics and matchesSemantics children mismatch check (flutter/flutter#188827) 2026-07-01 [email protected] [AGP 9] Support Enabling Built-in Kotlin (flutter/flutter#188543) 2026-07-01 [email protected] Roll Skia from d19e557ac317 to 0fc8ba72e802 (4 revisions) (flutter/flutter#188879) 2026-07-01 [email protected] [ci] Increase test timeout for Mac_x64 build_tests shards (flutter/flutter#188804) 2026-07-01 [email protected] Roll Skia from bd4ae38ca3bb to d19e557ac317 (1 revision) (flutter/flutter#188865) 2026-07-01 [email protected] Roll Dart SDK from 26d723eb89af to e47361c7fe9a (5 revisions) (flutter/flutter#188864) 2026-07-01 [email protected] Update triage links for material_ui and cupertino_ui --> Design triage (flutter/flutter#188567) 2026-07-01 [email protected] [Impeller] Share a single ContextGLES among all PlaygroundImplGLES (flutter/flutter#188080) 2026-07-01 [email protected] Use null-aware elements in dev/devicelab/lib/integration_tests.dart (flutter/flutter#187852) 2026-07-01 [email protected] Roll Packages from 274ed3e to e742106 (18 revisions) (flutter/flutter#188863) 2026-07-01 [email protected] Add android 17 to embedding (flutter/flutter#187965) 2026-07-01 [email protected] Adds semantics role check to isSemantics and matchesSemantics (flutter/flutter#188825) 2026-07-01 [email protected] Roll Dart SDK from e1bdb9ce3327 to 26d723eb89af (3 revisions) (flutter/flutter#188795) 2026-07-01 [email protected] [web] Apply autocapitalize to text editing elements (flutter/flutter#188351) 2026-07-01 [email protected] Roll Fuchsia Linux SDK from RymJjIj7dd5vQ3Cnh... to I2h2eXk06RrA3pIG2... (flutter/flutter#188852) 2026-07-01 [email protected] [Impeller] Compute dispatch takes 3D workgroup counts and honors the shader local_size (flutter/flutter#188601) 2026-07-01 [email protected] Improve stylus support on linux (flutter/flutter#186831) 2026-07-01 [email protected] Resolve issue Catch am start failures with 'Error type' and prevent hang (flutter/flutter#187196) 2026-07-01 [email protected] Roll Skia from ef178c9898af to bd4ae38ca3bb (3 revisions) (flutter/flutter#188834) 2026-07-01 [email protected] Roll Skia from 3ac99be47229 to ef178c9898af (3 revisions) (flutter/flutter#188831) 2026-07-01 [email protected] Add a macosArm64Only feature flag (flutter/flutter#188598) 2026-07-01 [email protected] Roll Skia from 15302f1625b2 to 3ac99be47229 (1 revision) (flutter/flutter#188819) 2026-07-01 [email protected] [flutter_tools] Track asset transformer dependencies for hot reload (Reland #187947) (flutter/flutter#188808) 2026-06-30 [email protected] Add TapRegion samples (flutter/flutter#188685) 2026-06-30 [email protected] Print a warning in `flutter doctor` when running on Intel Macs (flutter/flutter#188760) 2026-06-30 [email protected] [framework] Keep scrollable semantics role stable (flutter/flutter#187963) 2026-06-30 [email protected] feat(skills): Add shepherd-prs skill for managing approved external contributor PRs (flutter/flutter#188534) 2026-06-30 [email protected] Roll Skia from 71947c4110b0 to 15302f1625b2 (17 revisions) (flutter/flutter#188815) 2026-06-30 [email protected] [Tool] Run re-entrant upgrade in original CWD (flutter/flutter#188794) ...
Reland of #187947 (reverted in #188751)
This is a reland of the previously reverted PR #187947. The failure in Mac
web_tool_teststhat triggered the revert was determined to be an unrelated flake. Specifically, the test failed in build 29841 (which also failed in 29846 without the PR).Original description:
[flutter_tools] Track asset transformer dependencies for hot reload
Allow asset transformers to register additional input dependencies for hot reload by passing a
--depfileflag to the transformer subprocess and parsing the resulting Ninja-format depfile.Key changes:
AssetTransformernow passes--depfileand parses it usingDepfileService, returning dependencies in a newAssetTransformationResult.DevelopmentAssetTransformertracks these dependencies and provides them toDevFS.DevFS.updateBundledoes not skip transformed assets on startup, running the transformer to collect dependencies but optimizing by not uploading them to the device unless requested (e.g., for Web).DevFS.updateBundlechecks if any tracked dependencies are invalidated and triggers re-transformation.DevFS.updateandWebDevFS.updateappend collected dependencies to the watchedsourcesset.copyAssetsbuild target collects and adds these dependencies to its inputs to ensure correct rebuilds.Fixes #187051