serveAvailableExtensions method
Serves any available DevTools extensions for the given
rootFileUriString
, where rootFileUriString
is the root for a Dart or
Flutter project containing the .dart_tool/
directory.
rootFileUriString
is expected to be a file URI string (e.g. starting
with 'file://').
This method first looks up the available extensions using
package:extension_discovery, and the available extension's
assets will be copied to the build/devtools_extensions
directory that
DevTools server is serving.
Implementation
Future<void> serveAvailableExtensions(
String? rootFileUriString,
List<String> logs,
DtdInfo? dtd,
) async {
logs.add(
'ExtensionsManager.serveAvailableExtensions for '
'rootPathFileUri: $rootFileUriString',
);
_clear();
final parsingErrors = StringBuffer();
// Find all runtime extensions for [rootFileUriString], if non-null and
// non-empty.
if (rootFileUriString != null && rootFileUriString.isNotEmpty) {
logs.add(
'ExtensionsManager.serveAvailableExtensions adding extensions for app '
'root.',
);
await _addExtensionsForRoot(
rootFileUriString,
logs: logs,
parsingErrors: parsingErrors,
staticContext: false,
);
}
// Find all static extensions for the project roots, which are derived from
// the Dart Tooling Daemon, and add them to [devtoolsExtensions].
final dtdUri = dtd?.localUri;
if (dtdUri != null) {
DartToolingDaemon? dartToolingDaemon;
try {
dartToolingDaemon = await DartToolingDaemon.connect(dtdUri);
final projectRoots = await dartToolingDaemon.getProjectRoots(
depth: staticExtensionsSearchDepth,
);
logs.add(
'ExtensionsManager.serveAvailableExtensions adding extensions for '
'DTD project roots: ${projectRoots.uris?.toString() ?? []}',
);
for (final root in projectRoots.uris ?? const <Uri>[]) {
// Skip the runtime app root. These extensions have already been
// added to [devtoolsExtensions].
if (root.toString() == rootFileUriString) continue;
await _addExtensionsForRoot(
root.toString(),
logs: logs,
parsingErrors: parsingErrors,
staticContext: true,
);
}
} finally {
await dartToolingDaemon?.close();
}
}
if (parsingErrors.isNotEmpty) {
throw ExtensionParsingException(
'Encountered errors while parsing extension config.yaml '
'files:\n$parsingErrors',
);
}
}