Repository navigation
[flutter_tools] Support package wildcard assets in app pubspec - #191266
Conversation
Fixes an issue where wildcard directory assets from dependent packages (e.g., `packages/package_name/directory/`) declared in the app's `pubspec.yaml` were not resolved correctly. Previously, the tool tried to resolve these directories relative to the app's root directory, leading to "unable to find directory entry" errors. Now, `_parseAssetsFromFolder` resolves the package directory using `packageConfig` and correctly maps the files inside to package-relative URIs (e.g., `packages/packageName/...`) so they are bundled with the correct keys. Fixes flutter#27802
There was a problem hiding this comment.
Code Review
This pull request adds support for bundling assets from a package directory when the app lists the package directory in its pubspec.yaml, including a new test case. The review feedback suggests checking that assetUri.pathSegments has at least two elements to prevent a potential RangeError, and using a null-assertion operator on packageLibPath to avoid an unintended fallback to the current working directory.
| final bool isPackageAsset = | ||
| assetUri.pathSegments.isNotEmpty && | ||
| assetUri.pathSegments.first == 'packages' && | ||
| !_fileSystem.directory(localDirectoryPath).existsSync(); |
There was a problem hiding this comment.
If assetUri.pathSegments has only one element (for example, if the asset path is just packages or packages/), accessing assetUri.pathSegments[1] on line 1241 will throw a RangeError (index out of range).
To prevent this potential crash, we should ensure that assetUri.pathSegments has at least 2 elements before treating it as a package asset.
| final bool isPackageAsset = | |
| assetUri.pathSegments.isNotEmpty && | |
| assetUri.pathSegments.first == 'packages' && | |
| !_fileSystem.directory(localDirectoryPath).existsSync(); | |
| final bool isPackageAsset = | |
| assetUri.pathSegments.length >= 2 && | |
| assetUri.pathSegments.first == 'packages' && | |
| !_fileSystem.directory(localDirectoryPath).existsSync(); |
There was a problem hiding this comment.
Addressed in latest commit by requiring assetUri.pathSegments.length >= 2 && assetUri.pathSegments[1].isNotEmpty.
| final uri = Uri.file(relativePath, windows: _platform.isWindows); | ||
| final Uri uri; | ||
| if (isPackageAsset) { | ||
| final String relativePathToLib = _fileSystem.path.relative(file.path, from: packageLibPath); |
There was a problem hiding this comment.
Since packageLibPath is declared as a nullable String?, passing it directly to from in _fileSystem.path.relative is allowed because from is also nullable. However, if it were null, relative would default to the current working directory, which is not the intended behavior here.
Since we are inside the isPackageAsset block where packageLibPath is guaranteed to be non-null, we should use the null-assertion operator ! (similar to resolvedPackageName!) to make the intent clear and prevent any accidental fallback.
| final String relativePathToLib = _fileSystem.path.relative(file.path, from: packageLibPath); | |
| final String relativePathToLib = _fileSystem.path.relative(file.path, from: packageLibPath!); |
There was a problem hiding this comment.
Using from: packageLibPath! triggers the unnecessary_null_checks analyzer lint because from: accepts String?. packageLibPath is assigned a non-null value in the isPackageAsset branch, so it safely passes the non-null package base directory.
…ckage directory assets Prevents treating directory paths like `packages/` as package assets when they do not exist locally, ensuring `assetUri.pathSegments[1]` is non-empty before attempting package asset resolution.
…vestigation/issue-27802
|
auto label is removed for flutter/flutter/191266, Failed to enqueue flutter/flutter/191266 with HTTP 400: Pull request Required status check "Check Code Freeze" is queued.. |
Roll Flutter from c2437523d308 to 65c9a8dc60bc (195 revisions) flutter/flutter@c243752...65c9a8d 2026-08-22 engine-flutter-autoroll@skia.org Roll ICU from d578f2e8b7bd to 8cc91d9b6ab9 (1 revision) (flutter/flutter#191542) 2026-08-22 engine-flutter-autoroll@skia.org Roll Skia from 666a9b3d5cf0 to ad2106c0bb64 (3 revisions) (flutter/flutter#191527) 2026-08-22 engine-flutter-autoroll@skia.org Roll Fuchsia Test Scripts from KaOq3EE4qJ9fnaaaK... to 0iCv10IlKfiilEBOU... (flutter/flutter#191524) 2026-08-22 bkonyi@google.com [flutter_tools] Add tests for negative lookahead regex in test runner and batch entrypoints (flutter/flutter#191438) 2026-08-22 engine-flutter-autoroll@skia.org Roll Skia from 0c37868737fa to 666a9b3d5cf0 (2 revisions) (flutter/flutter#191518) 2026-08-21 10456171+caroqliu@users.noreply.github.com Revert "[input] Migrate fuchsia.ui.pointerinjector to TouchSource (#190855) (flutter/flutter#191509) 2026-08-21 30870216+gaaclarke@users.noreply.github.com Fixes windows gallery benchmarks by forcing mobile layout (flutter/flutter#191507) 2026-08-21 bkonyi@google.com [flutter_tools] Restrict WebAssetServer source resolution to source map extensions (flutter/flutter#191501) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from f6900c5b8439 to 0c37868737fa (2 revisions) (flutter/flutter#191504) 2026-08-21 bkonyi@google.com Refactor `FlutterDevice.connect` and VM service discovery (flutter/flutter#191221) 2026-08-21 bkonyi@google.com [flutter_tools] Fix crash when migrating flow-style exclude lists in analysis_options.yaml (flutter/flutter#191269) 2026-08-21 269567208+reidbaker-agent@users.noreply.github.com [rules] Add packages/flutter_tools/gradle/AGENTS.md rules (flutter/flutter#191486) 2026-08-21 kevmoo@users.noreply.github.com [flutter_tools] refactor CLI argument architecture with typed option descriptors and bundles (PoC) (flutter/flutter#191018) 2026-08-21 bkonyi@google.com tools: Extract Dart SDK to temp directory before moving to final location (flutter/flutter#191263) 2026-08-21 1961493+harryterkelsen@users.noreply.github.com [web] Move CanvasKit fragment shader classes to canvaskit/fragment_shader.dart (flutter/flutter#191451) 2026-08-21 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from GCQlmt6h-esJsNubS... to ic6GjOSn-KN508XyK... (flutter/flutter#191485) 2026-08-21 bkonyi@google.com [Widget Preview] Isolate PageStorage scope in widget preview group expansion tile (flutter/flutter#191378) 2026-08-21 bkonyi@google.com [flutter_tools] Deprecate --build and --no-build flags on flutter run (flutter/flutter#191358) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from 70988bed1b3b to f6900c5b8439 (2 revisions) (flutter/flutter#191481) 2026-08-21 engine-flutter-autoroll@skia.org Roll Packages from 1785501 to 252bb33 (6 revisions) (flutter/flutter#191480) 2026-08-21 engine-flutter-autoroll@skia.org Roll Fuchsia Linux SDK from 20IJas24bZiNmCZTK... to GCQlmt6h-esJsNubS... (flutter/flutter#191415) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from 2ba6971bd0d1 to 70988bed1b3b (2 revisions) (flutter/flutter#191476) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from 1d5f72537ba6 to 2ba6971bd0d1 (2 revisions) (flutter/flutter#191473) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from 2c25efd2e369 to 1d5f72537ba6 (1 revision) (flutter/flutter#191472) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from 09b1b810850a to 2c25efd2e369 (9 revisions) (flutter/flutter#191470) 2026-08-21 flar@google.com [Impeller] fix position of cached single glyph text shadows (flutter/flutter#191325) 2026-08-21 engine-flutter-autoroll@skia.org Roll Skia from abdf8821f313 to 09b1b810850a (15 revisions) (flutter/flutter#191458) 2026-08-21 me@bnsaed.com Document that programmatic TextEditingController changes do not run input formatters (flutter/flutter#190166) 2026-08-21 30870216+gaaclarke@users.noreply.github.com Adds new gallery benchmarks to windows (skia and impeller) (flutter/flutter#191454) 2026-08-21 chris@bracken.jp iOS: Deprecate FlutterEngine.isGpuDisabled (flutter/flutter#191393) 2026-08-21 154381524+flutteractionsbot@users.noreply.github.com Revert: [web] Unskip decoration image lerp tests (flutter/flutter#191462) 2026-08-20 awolff@google.com android_hardware_smoke_test: Improve reliability (flutter/flutter#191374) 2026-08-20 77467499+wilyan09007@users.noreply.github.com Don't size or offset the Android platform view before it is laid out (flutter/flutter#190895) 2026-08-20 15619084+vashworth@users.noreply.github.com [iOS][add2app] Skip building SwiftPM plugins when generating CocoaPods artifacts (flutter/flutter#190736) 2026-08-20 33794642+FelixMittermeier@users.noreply.github.com Optimize JSONMessageCodec UTF-8 conversion (flutter/flutter#190529) 2026-08-20 bkonyi@google.com [FML] Replace deprecated wstring_convert with Win32 APIs (flutter/flutter#191394) 2026-08-20 victorsanniay@gmail.com SliverFillRemaining extends beyond viewport size when fillOverscroll is true (flutter/flutter#191236) 2026-08-20 bkonyi@google.com [flutter_tools] Update argParser usageLineLength when --wrap-column is passed (flutter/flutter#191264) 2026-08-20 bkonyi@google.com [flutter_tools] Fix UNC path resolution in depfile parsing on Windows (flutter/flutter#191265) 2026-08-20 1961493+harryterkelsen@users.noreply.github.com [web] Unskip decoration image lerp tests (flutter/flutter#191426) 2026-08-20 bkonyi@google.com Do not inject 'type' and 'method' into service extension responses (flutter/flutter#190946) 2026-08-20 bkonyi@google.com [flutter_tools] Fix crash in symbolize command on stream error (flutter/flutter#191273) 2026-08-20 bkonyi@google.com [flutter_tools] Prevent deletion of shared native asset hooks outputs as stale (flutter/flutter#191272) 2026-08-20 bkonyi@google.com [flutter_tools] Support package wildcard assets in app pubspec (flutter/flutter#191266) 2026-08-20 108678139+manu-sncf@users.noreply.github.com Add SliverClipRect and SliverClipRRect (flutter/flutter#179003) 2026-08-20 bkonyi@google.com [flutter_tools] Implement Diagnostics extension slice and doctor integration (flutter/flutter#191162) ...
Allow application
pubspec.yamlfiles to declare directory wildcard assets pointing into dependencies (e.g.packages/package_name/directory/) and resolve them correctly from package libraries.Fixes #27802
Pre-launch Checklist
///).