| # Debugging Dart Hooks |
| |
| When a build[^1] hook isn't working as expected, you can investigate the |
| intermediate files generated by the Dart and Flutter SDK build process. These |
| files provide insight into the inputs, outputs, and any errors that occurred |
| during the hook's execution. |
| |
| ## Key Debugging Directory |
| |
| All debugging artifacts are stored within the `.dart_tool` directory of your |
| project. The hook runner generates a unique folder for each hook execution, |
| containing temporary and output files. |
| |
| You can find the most important debugging files in a subdirectory specific to |
| your hook's execution. The path is of the form |
| `.dart_tool/hooks_runner/<package_name>/<some_hash>/`, where `<package_name>` |
| is the name of the package containing the hook. For example, for a hook in a |
| package named `sqlite`, it would be |
| `.dart_tool/hooks_runner/sqlite/221e109fbc/`. |
| |
| When you run a build, hooks for all dependencies are executed, so you might see |
| multiple package directories. |
| |
| The `<some_hash>` is a checksum of the hook's configuration. If you are unsure |
| which hash directory to inspect within your package's hook directory, you can |
| delete the `.dart_tool/hooks_runner/<package_name>/` directory and re-run the |
| command that failed. The newly created directory will be for the latest |
| invocation. |
| |
| Inside this directory, you will find: |
| |
| * `input.json`: Contains the exact configuration and data passed *into* your |
| build hook. Reviewing this helps confirm if the hook is receiving the expected |
| build configuration. |
| * `output.json`: This file stores the JSON data that your build hook *produced* |
| as its result. |
| * `stdout.txt`: Captures any standard output from your build hook. This is where |
| messages from a logger or `print` statements will appear. |
| * `stderr.txt`: Captures any error messages or exceptions thrown during the |
| hook's execution. |
| |
| ## Using a Debugger |
| |
| To step through your code with a debugger, run the build hook from its source |
| file and provide the `input.json` via the `--config` flag. This allows you to |
| set breakpoints in your IDE and inspect the hook's execution. |
| |
| For example: |
| |
| ```sh |
| dart run hook/build.dart --config .dart_tool/hooks_runner/your_package_name/some_hash/input.json |
| ``` |
| |
| Make sure to replace `hook/build.dart`, `your_package_name`, and |
| `some_hash` with the actual paths from your project. |
| |
| ## VS Code Launch Configuration |
| |
| To debug in VS Code, you can create a `launch.json` file in a `.vscode` |
| directory in your project root. This allows you to run your hook with a |
| debugger attached. |
| |
| Here is an example configuration: |
| |
| ```json |
| { |
| "version": "0.2.0", |
| "configurations": [ |
| { |
| "name": "Debug Hook", |
| "type": "dart", |
| "request": "launch", |
| "program": "path/to/your/hook/build.dart", |
| "args": [ |
| "--config", |
| ".dart_tool/hooks_runner/your_package_name/some_hash/input.json" |
| ] |
| } |
| ] |
| } |
| ``` |
| |
| Again, make sure to replace `path/to/your/hook/build.dart`, |
| `your_package_name`, and `some_hash` with the actual paths from your project. |
| After setting this up, you can run the "Debug Hook" configuration from the |
| "Run and Debug" view in VS Code. |
| |
| [^1]: This debugging strategy also works for other hooks than build hooks, but |
| this documentation focuses specifically on build hooks. |