| # DevTools extension examples |
| This directory contains end-to-end examples of DevTools extensions. Each |
| end-to-end example is made up of three components: |
| 1. **Parent package**: Dart package that provides the extension |
| 2. **DevTools extension**: the tool itself |
| 3. **End-user application**: the app that the extension is used on |
| |
| ## Parent package |
| |
| This is the Dart package that provides a DevTools extension for end-user |
| applications to use in DevTools. There are multiple extension-providing pacakges |
| in the `example` directory. |
| |
| - `package:foo` from `packages_with_extensions/foo/packages/foo`: a package for Flutter apps |
| |
| - `package:dart_foo` from `packages_with_extensions/dart_foo/packages/dart_foo`: a |
| pure Dart package for Dart or Flutter apps |
| |
| <!-- TODO(kenz): build this example. --> |
| <!-- - `package:standalone_tool` from `packages_with_extensions/dart_foo/packages/stanalone_tool`, which is a package that is strictly meant to provide a tool |
| as a DevTools extension. This is different from the other packages in that it |
| is not an extension shipped with an existing Dart package. It is a package |
| published solely to provide a DevTools extension. --> |
| |
| <!-- TODO(kenz): build this example, or pull in Khan's extension. --> |
| <!-- - `package:gemini_ai_tool` from `packages_with_extensions/dart_foo/packages/gemini_ai_tool`, which is a standalone tool (like `package:standalone_tool`) |
| that provides an example of using the Gemini SDK to build an AI powered tool |
| as a DevTools extension. --> |
| |
| ## DevTools extension |
| |
| These are Flutter web apps that will be embedded in DevTools when connected to an app |
| that depends on the [parent package](#parent-package). |
| |
| - `packages_with_extensions/foo/packages/foo_devtools_extension`: this |
| is the Flutter web app whose built assets are included in `package:foo`'s |
| `extension/devtools/build` directory. |
| |
| - `packages_with_extensions/dart_foo/packages/dart_foo_devtools_extension`: this |
| is the Flutter web app whose built assets are included in `package:dart_foo`'s |
| `extension/devtools/build` directory. |
| |
| ## End-user application |
| |
| These are the applications that depend on the [parent package](#parent-package) and |
| can connect to the [DevTools extension](#devtools-extension) provided by the parent package. |
| |
| ### `app_that_uses_foo` |
| |
| This Flutter app depends on `package:foo` and `package:dart_foo`. When debugging |
| `app_that_uses_foo`, or one if its `bin/` or `test/` libraries, the provided |
| DevTools extensions will load in their own tab in DevTools. |
| |
| - `flutter run` the `app_that_uses_foo` app and open DevTools to see both the |
| `package:foo` and `package:dart_foo` extensions in DevTools connected to a |
| Flutter app. |
| |
| - Run `dart run --observe bin/script.dart` and open DevTools to see the |
| `package_dart_foo` extension in DevTools connected to a Dart CLI app. |
| |
| <!-- TODO(kenz): uncomment once https://github.com/flutter/devtools/issues/7183 is resolved. --> |
| <!-- - Run `dart test test/nested/simple_test.dart --pause-after-load` and open |
| DevTools to see the `package:dart_foo` extension connected to a Dart test. |
| |
| - Run `flutter test test/app_that_uses_foo_test.dart --start-paused` and open |
| DevTools to see both the `package:foo` and `package:dart_foo` extensions |
| connected to a Flutter test. --> |
| |
| ## Learn how to structure your Dart package |
| |
| The examples will show you how to structure your package for optimal extension |
| development and publishing. |
| |
| 1. If you are adding a DevTools extension to an existing Dart package, this is |
| the recommended structure: |
| ``` |
| foo/ # formerly the repository root of your pub package |
| packages/ |
| foo/ # your pub package |
| extension/ |
| devtools/ |
| build/ |
| ... # pre-compiled build output of foo_devtools_extension |
| config.yaml |
| foo_devtools_extension/ # source code for your extension |
| ``` |
| `package:foo` and `package:dart_foo` provide an example of this structure. |
| |
| 2. If you are creating a DevTools extension as a standalone package, this is |
| the recommended structure: |
| ``` |
| standalone_tool/ # your new pub package |
| extension/ |
| devtools/ |
| build/ |
| ... # pre-compiled build output of standalone_tool |
| config.yaml |
| lib/ # source code for your extension |
| ``` |
| <!-- TODO(kenz): uncomment once these examples are provided. --> |
| <!-- `package:standalone_tool` and `package:gemini_ai_tool` provide an example of this structure. --> |
| |
| The pre-compiled build output included in the example packages' |
| `extension/devtools/build` directories were included using the `build_and_copy` |
| command provided by `package:devtools_extensions`. |
| - For example, `package:foo`'s `extension/devtools/build` directory was populated |
| by running the following command from the `foo_devtools_extension/` directory: |
| |
| ```sh |
| flutter pub get && |
| dart run devtools_extensions build_and_copy \ |
| --source=. \ |
| --dest=../foo/extension/devtools |
| ``` |
| ## Learn how to configure your extension's `config.yaml` file |
| |
| In these examples, you will also learn how to properly configure your extension's |
| `config.yaml` file. DevTools reads this file in order to embed your extension in its |
| own tab. This file must be configured as shown. |
| |
| ```yaml |
| name: foo |
| issueTracker: <link_to_your_issue_tracker.com> |
| version: 0.0.1 |
| materialIconCodePoint: '0xe0b1' |
| ``` |
| |
| For the most up-to-date documentation on the `config.yaml` spec, see |
| [extension_config_spec.md](https://github.com/flutter/devtools/blob/master/packages/devtools_extensions/extension_config_spec.md) |
| |
| ## Learn how to use shared packages from DevTools |
| |
| To learn how to use the shared packages from Devtools (`package:devtools_extensions` |
| and `package:devtools_app_shared`), see the source for the `package:foo` extension. |
| |
| `packages_with_extensions/foo/packages/foo_devtools_extension` provides in-depth |
| examples of how to do things like interact with the connected app's VM service, |
| read / write to the user's project files over the Dart Tooling Daemon, interact |
| with the DevTools extension framework APIs, etc. |