| # Layout of the `.dart_tool/pub` folder |
| |
| The pub client creates `.dart_tool/package_config.json` as described by |
| [https://github.com/dart-lang/language/blob/main/accepted/2.8/language-versioning/package-config-file-v2.md]. |
| |
| But furthermore pub can use a folder called `.dart_tool/pub` for storing |
| artifacts. The organization of that folder is what this document is trying to describe. |
| |
| The information in this document is informational, and can be used for |
| understanding the cache, but we strongly encourage all manipulation of the |
| `.dart_tool/pub` folder happens though the `dart pub`/`flutter pub` commands to |
| avoid relying on accidental properties that might be broken in the future. |
| |
| ## Precompilation cache |
| |
| ```tree |
| .dart_tool/ |
| ├── package_config.json |
| ├── pub |
| │ ├── bin |
| │ │ ├── pub |
| │ │ │ └── pub.dart-3.1.0.snapshot.incremental |
| │ │ └── test |
| │ │ └── test.dart-3.2.0-36.0.dev.snapshot |
| |
| ``` |
| |
| When `dart run <package>:<executable>` is called, pub will try to find `<executable>` in |
| the package `<package>` and compile it as a "dill" file (using |
| `package:frontend_server_client`). |
| |
| The output will be stored in The dill file will be stored in |
| `.dart_tool/pub/bin/<package>/<executable>.dart-<sdk-version>.snapshot`. |
| |
| This can be used to run the executable by invoking (done implicitly by `dart run`): |
| |
| ``` |
| dart .dart_tool/pub/bin/<package>/<executable>.dart-<sdk-version>.snapshot |
| ``` |
| |
| But the dill-file is also fed to the compiler for incremental compilation. This |
| can in many cases greatly speed up the compilation when no change has happened. |
| |
| If the compilation fails, pub avoids leaving a `.snapshot` file, but instead leaves a |
| `.dart_tool/pub/bin/<package>/<executable>.dart-<sdk-version>.snapshot.incremental` file. |
| |
| This file cannot be executed. But it can still give the benefit of incremental |
| compilation when changes have happened to the code. |
| |
| Earlier versions of the dart sdk would put this "incremental" file in: |
| |
| `.dart_tool/pub/incremental/<package>/<executable>.dart-incremental.dill`. |
| |
| As we don't expect many of those files to linger, we don't attempt to clean them up. |
| |
| We use the `<sdk-version>` to enable different sdk-versions to each have their |
| own snapshot, so they don't step on each others toes when you switch from one |
| sdk to another. The downside is that there is no mechanism for deleting |
| snapshots of old sdks. We might want change that logic. |
| |
| One could argue that a "snapshot", is a different thing from a "dill" file in |
| Dart VM terms. But both can be invoked by the VM, and run rather quickly without |
| much more pre-compilation. In the future we might want to use true "snapshots" |
| for executables from immutable packages, as they don't benefit from incremental compilation. |