blob: f95574cf4f37c652083b17881d357272fa44a234 [file] [log] [blame] [view]
# Start a component during development
For testing and debugging purposes, the
[`ffx component`][ffx-component] commands can quickly
start a [dynamic component instance][dynamic-children] on a device.
## Concepts
Component instances on a device are usually declared using
[component manifests][component-manifests], which statically define the topology
and capabilities of the components on the device. However, statically declaring
a component isn't the only way to create a component instance
on a device. You can also use the `ffx component` commands to create a dynamic
component instance on the device at runtime.
One important difference is that Fuchsia restricts all dynamic
component instances to run under a [component collection][component-collection].
A collection serves as a container for dynamic component instances.
Consequently, the capabilities of component instances
under a collection are limited by the capabilities that the collection is able
to expose and offer.
While a new component collection can be declared using a component manifest
(similar to declaring a static component instance), Fuchsia
provides a number of predefined collections for general usage.
For instance, [`ffx-laboratory`][ffx-laboratory] is one of those predefined
collections.
## Start a component {:#start-a-component}
To create a new dynamic component instance, you first need to run
[`ffx component create`][ffx-component-create] to add a new component
to the component instance tree on a device. Once added,
you can run [`ffx component start`][ffx-component-start] to start the component
on the device.
To start a new dynamic component instance on a device, do the following:
1. Create a new component instance:
```posix-terminal
ffx component create <TARGET_MONIKER> <COMPONENT_URL>
```
Replace the following:
* `TARGET_MONIKER`: The destination moniker of a new component instance. The
moniker must include a component collection on the path.
* `COMPONENT_URL`: The resource location of a component.
The example below creates a new component instance for the
`hello-world-cpp.cm` component and assigns its moniker to be
`/core/ffx-laboratory:hello-world`:
```none {:.devsite-disable-click-to-copy}
$ ffx component create /core/ffx-laboratory:hello-world fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
URL: fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
Moniker: /core/ffx-laboratory:hello-world
Creating component instance...
```
Note: To remove this component instance from the tree, see
[Destroy a component](#destroy-a-component).
2. Start the component instance:
```posixe-terminal
ffx component start <TARGET_MONIKER>
```
Replace `TARGET_MONIKER` with the moniker used in Step 1.
The example below starts the component instance at
`/core/ffx-laboratory:hello-world`:
```none {:.devsite-disable-click-to-copy}
$ ffx component start /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Starting component instance...
```
Note: To stop this component instance, see
[Stop a component](#stop-a-component).
## Start a component under ffx-laboratory
Starting a dynamic component instance would normally require running a
sequence of the `ffx component create` and `ffx component start` commands
(see [Start a component](#start-a-component)). However,
the [`ffx component run`][ffx-component-run] command can start a dynamic
component instance in a single command line.
To quick start a component under the `ffx-laboratory` collection,
run the following command:
```posix-terminal
ffx component run /core/ffx-laboratory:<NAME> <COMPONENT_URL>
```
Replace `COMPONENT_URL` with the resource location of a component, and replace
`NAME` with the name for the component instance within the `ffx-laboratory`
collection.
The example below starts the `hello-world-cpp.cm` component on the device:
```none {:.devsite-disable-click-to-copy}
$ ffx component run /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
URL: fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
Moniker: /core/ffx-laboratory:hello-world-cpp
Creating component instance...
Starting component instance...
```
In essence, the `ffx component run` command performs the following steps:
1. Run `ffx component create` to create a new component instance under the
`ffx-laboratory` collection using the component name as the target moniker.
2. Run `ffx component start` to start the component instance on the device.
For instance, running `ffx component run /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm`
in the example above is equivalent to running the following commands:
```none {:.devsite-disable-click-to-copy}
$ ffx component create /core/ffx-laboratory:hello-world-cpp fuchsia-pkg://fuchsia.com/hello-world-cpp#meta/hello-world-cpp.cm
$ ffx component start /core/ffx-laboratory:hello-world-cpp
```
## Stop a component {:#stop-a-component}
To stop a running component instance on a device, run the following command:
```posix-terminal
ffx component stop <TARGET_MONIKER>
```
Replace `TARGET_MONIKER` with the moniker of a component instance.
The example below stops the component instance at
`/core/ffx-laboratory:hello-world`:
```none {:.devsite-disable-click-to-copy}
$ ffx component stop /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Stopping component instance...
```
## Destroy a component {:#destroy-a-component}
To remove a dynamic component instance from the component instance tree
on a device, run the following command:
```posix-terminal
ffx component destroy <TARGET_MONIKER>
```
Replace `TARGET_MONIKER` with the moniker of a component instance.
The example below removes the component instance at
`/core/ffx-laboratory:hello-world`:
```none {:.devsite-disable-click-to-copy}
$ ffx component destroy /core/ffx-laboratory:hello-world
Moniker: /core/ffx-laboratory:hello-world
Destroying component instance...
```
<!-- Reference links -->
[dynamic-children]: /docs/concepts/components/v2/realms.md#dynamic-children
[component-manifests]: /docs/concepts/components/v2/component_manifests.md
[component-collection]: /docs/concepts/components/v2/realms.md#collections
[ffx-component-run]: https://fuchsia.dev/reference/tools/sdk/ffx#run
[ffx-laboratory]: /docs/development/components/run.md#ffx-laboratory
[ffx-component]: https://fuchsia.dev/reference/tools/sdk/ffx#component
[component-lifecycle]: /docs/concepts/components/v2/lifecycle.md
[ffx-component-create]: https://fuchsia.dev/reference/tools/sdk/ffx#create_2
[ffx-component-start]: https://fuchsia.dev/reference/tools/sdk/ffx#start