How to package and upload a snap with components

Components are parts of a snap that can be built and uploaded in conjunction with a snap and later optionally installed beside it. Components are defined with a top-level components keyword in a snapcraft.yaml.

Start with a simple snapcraft.yaml:

name: hello-components
version: "1.0"
summary: A snap with a component
description: A simple snap with a component containing translations
base: core24
confinement: strict

parts:
  application:
    source: src
    plugin: dump

And create the following project tree:

.
└── src
    └── my-app

my-app can be an empty file. The contents are not important for this how-to guide.

To create a component, define a component called translations under a new top-level components keyword. We will also add a new part that dumps the contents of the translations directory:

name: hello-components
version: "1.0"
summary: A snap with a component
description: A simple snap with a component containing translations
base: core24
confinement: strict

components:
  translations:
    type: standard
    summary: Translations modules
    description: Translations modules
    version: "1.0"

parts:
  application:
    source: src
    plugin: dump

  translations:
    source: translations
    plugin: dump

Next, create a translations directory with a file called la:

.
├── src
│   └── my-app
└── translations
    └── la

la can also be an empty file.

Pack the snap with:

snapcraft pack

This will produce 2 artefacts, the snap and the component:

  • hello-components_1.0_amd64.snap

  • hello-components+translations_1.0.comp

The my-app and la files are staged, primed, and packed in the snap artefact. The component artefact has no payload. It is empty except for a metadata file meta/component.yaml.

To move the la translation file to the component artefact, use the organize keyword for the translations part:

name: hello-components
version: "1.0"
summary: A snap with a component
description: A simple snap with a component containing translations
base: core24
confinement: strict

components:
  translations:
    type: standard
    summary: Translations modules
    description: Translations modules
    version: "1.0"

parts:
  application:
    source: src
    plugin: dump

  translations:
    source: translations
    plugin: dump
    organize:
      la: (component/translations)

The parentheses around (component/translations) indicate that the files should be organized into the translations component’s install directory.

Pack the snap again with:

snapcraft pack

This will produce two artefacts again but the component now contains the la translation file.

To upload the snap and the component to the store, specify the snap file and the component file for the translations component.

snapcraft upload hello-components_1.0_amd64.snap \
  --component translations=hello-components+translations_1.0.comp

The store expects a snap and its components to be uploaded together.

The component has to be uploaded alongside the snap.