# Packages A package is the unit of installation on a Fuchsia system. ## Anatomy _To be added..._ ## Working with packages The majority of these instructions rely on the `pm` tool which is available in `//tools`. This document describes the various steps to build and install a package: * [Build a package](#build-package) * [Publish a package](#publish-package) * [Install a package](#install-package) * [Run a component from an installed package](#run-component) For more details about each step, see `pm`'s help messages. ### Build a package {#build-package} To build a package: 1. Create the package ID file: Note: `$PACKAGE_DIR` is a staging directory where the package is built. ``` pm -o $PACKAGE_DIR -n $PACKAGE_NAME init ``` This generates the package ID file implicitly as `$PACKAGE_DIR/meta/package`. Set `$PACKAGE_ID_FILE` accordingly for use in subsequent steps: ``` export PACKAGE_ID_FILE=${PACKAGE_DIR}/meta/package ``` `$PACKAGE_ID_FILE` will contain the following data: ``` { "name": "", "version": "" } ``` 2. Create the manifest file, `$MANIFEST_FILE`, that provides the path to the package ID file. Each line of a manifest file maps a single file that is contained in the package and is in the form of `destination=source` where: * `destination` is the path to the file in the final package * `source` is the path to the file on the host machine The manifest file must include at least one line for the package ID file like this: ``` meta/package= ``` 3. Generate the package metadata archive: ``` pm -o $PACKAGE_DIR -m $MANIFEST_FILE build ``` This creates the metadata archive at `$PACKAGE_DIR/meta.far`. 4. Create the package archive `$PACKAGE_ARCHIVE`: ``` pm -o $PACKAGE_DIR -m $MANIFEST_FILE archive ``` This command creates the package archive implicitly as `$PACKAGE_DIR/$PACKAGE_NAME-0.far`. Set `$PACKAGE_ARCHIVE` accordingly for use in subsequent steps: ``` export PACKAGE_ARCHIVE=${PACKAGE_DIR}/${PACKAGE_NAME}-0.far ``` If the contents of the package change, you need to re-run the `pm -o $PACKAGE_DIR -m $MANIFEST_FILE archive` command. You have successfully built a package. You are now ready to publish the package. ### Publish a package {#publish-package} To publish a package: 1. Initialize a directory, `$REPO`, that serves as a packages repository: ``` pm newrepo -repo $REPO ``` This creates a directory structure named `$REPO` that is ready for publishing packages. 2. Publish packages to the repository `$REPO`: ``` pm publish -a -r $REPO -f $PACKAGE_ARCHIVE ``` `pm publish` parses `$PACKAGE_ARCHIVE` and publishes the package in the provided `$REPO` directory. If you run this command multiple times with different package archives, `pm publish` publishes the packages to the same repository. New versions of a same package can be published using the same command. You have successfully published a package. You are now ready to install a package. ### Install a package {#install-package} To install a package: 1. Start the package server: ``` pm serve -repo $REPO ``` By default, this starts an amber server on the host machine at port `8083`. 2. (On the target device) Add the new repository as an update source with `amberctl`: ``` amberctl add_repo_cfg -n $REPO -f http://$HOST_ADDRESS:8083/config.json ``` If the component is not already on the system, `amberctl` installs the package. If the package already exists, `amberctl` installs any package updates. You have successfully installed or updated the package. You are now ready to run a component from the installed package. ### Run a component from an installed package {#run-component} To run a component published in a package: 1. (On the target device) Run: Note: `$COMPONENT_URI` is in this form `fuchsia-pkg://${REPO}/${PACKAGE_NAME}#meta/.cmx`. ``` run $COMPONENT_URI ``` You have successfully run a component from the installed package.