| # Provide data files to components |
| |
| ## Goal |
| |
| In the guide on [building components][build-components] we saw several examples |
| of defining components for executables and then packaging them. In this document |
| we review ways of making data files available to components in the same package. |
| |
| ## Hermetic data files with `resource()` |
| |
| At runtime, components are able to read the contents of their own package by |
| accessing the path `/pkg/` in their namespace. The `resource()` template may be |
| used to add contents to the package that may be accessed this way. |
| |
| {# note: the verbatim tags below are to avoid issues with the fuchsia.dev template engine #} |
| ```gn |
| import("//build/dist/resource.gni") |
| {% verbatim %} |
| # List of greetings |
| resource("greetings") { |
| sources = [ "greetings.txt" ] |
| outputs = [ "data/{{source_file_part}}" ] |
| }{% endverbatim %} |
| ``` |
| |
| For information about `{% verbatim %}{{source_file_part}}{% endverbatim %}` |
| and similar syntax see [GN placeholders][gn-placeholders]{:.external}. |
| |
| See [resource.gni][resource-gni] for more usage instructions on the `resource()` |
| template, and related templates `resource_group()` and `resource_tree()`. |
| |
| More examples using `resource()`, `resource_group()`, and `resource_tree()` can |
| be found in [additional packaged resources][additional-packaged-resources]. |
| |
| ### Including resources with a component |
| |
| Add a dependency on the resource target from a component in order to ensure that |
| the resource(s) are included in the same package. |
| |
| ```gn |
| import("//build/components.gni") |
| |
| # Sends a random greeting to a client |
| executable("greeter") { |
| sources = [ "greeter.cc" ] |
| deps = [ ... ] |
| } |
| |
| fuchsia_component("greeting_server") { |
| deps = [ |
| ":greeter", |
| ":greetings", |
| ] |
| manifest = "meta/greeting_server.cml" |
| } |
| ``` |
| |
| In the example above, at runtime the component will be able to read the file |
| in its namespace at the path `/pkg/data/greetings.txt`. This will work regardless |
| of what package(s) (defined with `fuchsia_package()`) this component is |
| included in. |
| |
| ### Packaging conventions |
| |
| * Small data files (less than 4kb) should be packaged under `meta/`, though |
| this is not required. Packaging small files under `meta/` allows the |
| packaging system to archive them in a single [`meta.far` file][metafar], |
| which is a more efficient way to store small files. |
| |
| * Otherwise, data files are usually packaged under `data/` by convention, |
| though again this is not a technical requirement. |
| |
| ### Using different resources in different packages |
| |
| Sometimes it's desirable to package the same component with different data |
| files. |
| |
| ```gn |
| import("//build/dist/resource.gni") |
| import("//build/components.gni") |
| |
| # Sends a random greeting to a client |
| executable("greeter") { |
| sources = [ "greeter.cc" ] |
| deps = [ ... ] |
| } |
| |
| fuchsia_component("greeting_server") { |
| deps = [ ":greeter" ] |
| manifest = "meta/greeting_server.cml" |
| } |
| |
| # List of production greetings. |
| # Contains only the finest greetings and the best regards. |
| resource("greetings") { |
| sources = [ "greetings.txt" ] |
| outputs = [ "data/greetings.txt" ] |
| } |
| |
| fuchsia_package("greeting") { |
| deps = [ |
| ":greeting_server", |
| ":greetings", |
| ] |
| } |
| |
| # Greetings for testing. |
| # Contains exactly one greeting so that tests are reproducible. |
| resource("test_greeting") { |
| testonly = true |
| sources = [ "test_greeting.txt" ] |
| outputs = [ "data/greetings.txt" ] |
| } |
| |
| # Connects to the greeting server. |
| # Ensures that the expected greeting is sent back. |
| fuchsia_test_component("greeting_test_client") { |
| ... |
| } |
| |
| fuchsia_test_package("greeting_integration_test") { |
| test_components = [ ":greeting_test_client" ] |
| deps = [ |
| ":greeting_server", |
| ":test_greeting", |
| ] |
| } |
| ``` |
| |
| In the example above, the same `greeting_server` component is added to two |
| packages, one for production and another for testing. In both cases the |
| component will find a file under `/pkg/data/greetings.txt`. However the |
| contents of this file will vary between the production version and the testing |
| version, depending on the package association. |
| |
| [additional-packaged-resources]: /docs/development/components/build.md#additional-packaged-resources |
| [build-components]: /docs/development/components/build.md |
| [gn-placeholders]: https://gn.googlesource.com/gn/+/HEAD/docs/reference.md#placeholders |
| [metafar]: /docs/concepts/packages/package.md#metafar |
| [resource-gni]: /build/dist/resource.gni |