Index: third_party/mojo/src/mojo/public/dart/README.md |
diff --git a/third_party/mojo/src/mojo/public/dart/README.md b/third_party/mojo/src/mojo/public/dart/README.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6de696b0426b89fde36fe9d3e34d0254f9c1c42b |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/dart/README.md |
@@ -0,0 +1,126 @@ |
+Dart Mojo Applications |
+==== |
+ |
+## Mojo Application API |
+ |
+*TODO(zra)* |
+ |
+## Application Packaging |
+ |
+All Dart sources for a Mojo application are collected in a specially formatted |
+zip file, which is understood by Dart's content handler in the Mojo shell. |
+This section describes what the various parts of that package are, and how they |
+all make it to the right place. |
+ |
+### GN Template |
+ |
+Dart Mojo applications are built with the GN template |
+'dart_packaged_application' defined in `//mojo/public/dart/rules.gni`. |
+Here is an example: |
+ |
+ |
+``` |
+dart_packaged_application("foo") { |
+ output_name = "dart_foo" |
+ uses_pub = true |
+ sources = [ |
+ "main.dart", |
+ "foo.dart", |
+ ] |
+ deps = [ |
+ "//mojo/public/dart", |
+ "//mojo/services/network/public/interfaces", |
+ ] |
+} |
+``` |
+ |
+There are several parts: |
+* `output_name` is the name of the resulting .mojo file if it should be |
+ different from the name of the target. (In this case we get dart_foo.mojo |
+ instead of foo.mojo.) |
+* `uses_pub` should be true when the application depends on Dart packages pulled |
+ down from pub. The application should have `pubspec.yaml` and `pubspec.lock` |
+ files adjacent to `main.dart`. More on this below. |
+* `sources` is the list of Dart sources for the application. Each application |
+ **must** contain a `main.dart` file. `main.dart` must be the library entry |
+ point, and must contain the `main()` function. |
+* `deps` has the usual meaning. In the example above, |
+ `//mojo/services/network/public/interfaces` indicates that the "foo" |
+ application uses the Dart bindings generated for the network service. |
+ |
+### pub packages |
+ |
+Dart Mojo applications may use packages from the pub package repository at |
+pub.dartlang.org. |
+ |
+The "foo" example above has `uses_pub` set to true. Suppose its `pubspec.yaml` |
+is as follows: |
+ |
+``` |
+name: foo |
+version: 0.0.1 |
+description: Foo |
+dependencies: |
+ crypto: ">=0.9.0 <0.10.0" |
+``` |
+ |
+The script `//mojo/public/tools/git/dart_pub_get.py` should be run before build |
+time, e.g. as a "runhooks" action during `gclient sync`. The script traverses |
+a directory tree looking for `pubspec.yaml` files. On finding one, in the |
+containing directory, it runs `pub get`. This creates a "packages/" directory |
+in the source tree adjacent to the `pubspec.yaml` file containing the downloaded |
+Dart packages. `pub get` also creates a `pubspec.lock` file that locks down |
+pub packages to specific versions. This `pubspec.lock` file must be checked in |
+in order to have hermetic builds. |
+ |
+During the build, The `dart_packaged_application` rule looks for a "packages/" |
+directory, and copies its contents into the zip file. |
+ |
+### Generated bindings |
+ |
+The script `//mojo/public/tools/bindings/generators/mojom_dart_generator.py` |
+and the templates under `//mojo/public/tools/bindings/generators/dart_templates` |
+govern how `.mojom` files are compiled into Dart code. |
+ |
+Consider the `network_error.mojom` file from the network services used by our |
+"foo" example: |
+ |
+``` |
+module mojo; |
+ |
+struct NetworkError { |
+ int32 code; |
+ string? description; |
+}; |
+``` |
+ |
+This contents of this file are in the `mojo` module. The Dart source generated |
+for this file will end up under, e.g. |
+`//out/Debug/gen/dart-gen/mojom/mojo/network_error.mojom.dart`, along with the |
+other Dart sources generated for `.mojom` files in the `mojo` module. |
+ |
+### Resulting layout |
+ |
+They layout for our "foo" example will be the following: |
+ |
+``` |
+//main.dart |
+//foo.dart |
+//crypto/... # Dart's crypto pub package. |
+//mojo/public/dart/... # Mojo SDK Dart libraries. |
+//mojom/mojo/... # Generated bindings in the mojo module. |
+``` |
+ |
+Where `//mojo/public/dart` contains Dart's Mojo bindings, `//crypto` contains |
+the `crypto` pub package, and `//mojom/mojo` contains the generated bindings in |
+the mojom module for the network service. |
+ |
+Mojo's Dart content handler sets the package root for a Dart application to be |
+the root directory of the unpacked zip file. Therefore, Dart sources in this |
+application can use the following imports: |
+ |
+```dart |
+import 'package:crypto/crypto.dart'; |
+import 'package:mojo/public/dart/application.dart'; |
+import 'package:mojom/mojo/network_error.mojom.dart'; |
+``` |