Snapcraft package repositories

When building a snap and constructing a part, package dependencies are listed as either package names or snaps for the snap’s build environment. This is covered in Build and staging dependencies.

For a default Snapcraft installation running Multipass, the build environment is invariably Ubuntu 22.04 LTS (Jammy Jellyfish) or Ubuntu 20.04 LTS (Focal Fossa). Consequently, dependencies are listed using their apt package names and are retrieved from the set of repositories officially supported by the distribution.

However, it’s also possible to add your own apt repositories as sources for build-packages and stage-packages, including those hosted on a PPA, the Personal Package Archive, which serves personally hosted non-standard packages.


Adding repositories

Third-party apt repositories can be added to a snap’s snapcraft.yaml by using the top-level package-repositories keyword with either a PPA-type repository, or a deb-type repository:

PPA-type repository:

package-repositories:
 - type: apt
   ppa: snappy-dev/snapcraft-daily

deb-type repository:

package-repositories:
  - type: apt
    components: [main]
    suites: [xenial]
    key-id: 78E1918602959B9C59103100F1831DDAFC42E99D
    url: http://ppa.launchpad.net/snappy-dev/snapcraft-daily/ubuntu

As shown above, PPA-type repositories and traditional deb-type each require a different set of properties:

Once configured, packages provided by these repositories will become available via stage-packages and build-packages.

The properties for both PPA-type and deb-type repositories are outlined below.


PPA properties

The following properties are supported for PPA-type repositories:

  • type (required): The type of package-repository, only apt is currently supported.
  • ppa (required): PPA identifier string.

  • type

    • Type: enum[string]
    • Description: Specifies type of package-repository, must currently be apt
    • Examples: type: apt
  • ppa

    • Type: string
    • Description: PPA shortcut string
    • Format: <ppa-owner>/<ppa-name>
    • Examples:
      • ppa: snappy-devs/snapcraft-daily
      • ppa: mozillateam/firefox-next

Deb properties

The following properties are supported for Deb-type repositories:

  • architectures: List of architectures to enable, or restrict to, for this repository.
  • components (required if using suites): List of apt repository components to enable, e.g. main , multiverse , unstable.
  • formats: List of deb types to enable (deb and/or deb-src).
  • key-id (required): 40-character GPG key identifier / thumbprint.
  • key-server: Key-server to request key from.
  • path (required if not using suites & components): Exact path to repository, relative to URL.
  • suites (required if not using path): List of apt suites to enable, e.g. bionic, focal.
  • type (required): type of package-repository. Only apt is currently supported.
  • url (required): apt repository URL.

  • architectures

    • Type: list[string]
    • Description: Architectures to enable, or restrict to, for this repository
    • Default: If unspecified, architectures is assumed to match the host’s architecture
    • Examples:
      • architectures: [i386]
      • architectures: [i386, amd64]
  • components

    • Type: list[string]
    • Description: Apt repository components to enable: e.g. main , multiverse , unstable
    • Examples:
      • components: [main]
      • components: [main, multiverse, universe, restricted]
  • formats

    • Type: list[string]
    • Description: List of deb types to enable
    • Default: If unspecified, format is assumed to be deb , i.e. [deb]
    • Examples:
      • formats: [deb]
      • formats: [deb, deb-src]
  • key-id

    • Type: string
    • Description: 40 character GPG key identifier (" long-form thumbprint" or “fingerprint”)
      If not using a key-server, Snapcraft will look for the corresponding key at: <project>/snap/keys/<key-id[-8:]>.asc .
      To determine a key-id from a given key file with gpg, type the following:
      gpg --import-options show-only --import <file>
    • Format: alphanumeric, dash - , and underscores _ permitted.
    • Examples:
      • key-id: 590CA3D8E4826565BE3200526A634116E00F4C82
        Snapcraft will install a corresponding key at <project>/snap/keys/E00F4C82.asc
  • key-server

    • Type: string
    • Description: Key server to fetch key <key-id> from
    • Default: If unspecified, Snapcraft will attempt to fetch a specified key from keyserver.ubuntu.com
    • Format: Key server URL supported by gpg --keyserver
    • Examples:
      • key-server: keyserver.ubuntu.com
      • key-server: hkp://keyserver.ubuntu.com:80
  • path

    • Type: string
    • Description: Absolute path to repository (from url ). Cannot be used with suites and components
    • Format: Path starting with /
    • Examples:
      • path: /
      • path: /my-repo
  • priority

    • Requires Snapcraft 7.4
    • Type: enum[string] or int
    • Description: Overrides the default behavior when picking the source for a particular package
    • Format: always, prefer or defer. Alternatively an int other than 0
    • Notes: string equivalencies are always: 1000; prefer: 990; defer: 100
    • Examples:
      • priority: always
      • priority: 1000
  • suites

    • Type: string
    • Description: Repository suites to enable
    • Notes: If your deb URL does not look like it has a suite defined, it is likely that the repository uses an absolute URL. Consider using path
    • Examples:
      • suites: [xenial]
      • suites: [xenial, xenial-updates]
  • type

    • Type: enum[string]
    • Description: Specifies type of package-repository
    • Notes: Must be apt
    • Examples:
      • type: apt
  • url

    • Type: string
    • Description: Repository URL.
    • Examples:
      • url: http://archive.canonical.com/ubuntu
      • url: https://apt-repo.com/stuff

Examples

PPA repository using "ppa" property

package-repositories:
  - type: apt
    ppa: snappy-dev/snapcraft-daily

Typical apt repository with components and suites

package-repositories:
  - type: apt
    components: [main]
    suites: [xenial]
    key-id: 78E1918602959B9C59103100F1831DDAFC42E99D
    url: http://ppa.launchpad.net/snappy-dev/snapcraft-daily/ubuntu

Apt repository enabling deb sources

package-repositories:
  - type: apt
    formats: [deb, deb-src]
    components: [main]
    suites: [xenial]
    key-id: 78E1918602959B9C59103100F1831DDAFC42E99D
    url: http://ppa.launchpad.net/snappy-dev/snapcraft-daily/ubuntu

Absolute path repository with implied root path "/"

package-repositories:
  - type: apt
    key-id: AE09FE4BBD223A84B2CCFCE3F60F4B3D7FA2AF80
    url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64`

Absolute path repository with explicit path and formats

package-repositories:
  - type: apt
    formats: [deb]
    path: /
    key-id: AE09FE4BBD223A84B2CCFCE3F60F4B3D7FA2AF80
    url: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64`

Preferring packages from a PPA

package-repositories:
  - type: apt
    ppa: deadsnakes/ppa
    priority: always
2 Likes

Is this stable? none of this is published on snapcraft.io stable documentation website.

eh? Not <ppa-owner>/<ppa-name>? Why are the = needed? and why two?

1 Like

Good catch! That was a formatting misfire I failed to notice. Fixed (to be as you expected) :smiley:

Thanks for posting these up-to-date schema! I’ve now updated the doc to reflect the new syntax and properties.

2 Likes

This page does not seem to be reachable from the left menu. I found it only by searching.

Thanks for letting us know, and you’re right - we had planned to add this to reference section, which I’ve now done.

4 Likes

Is this feature available on the Snapcraft build service? If not, can we add a warning in the docs so that one who uses the build service won’t bother to try to incorporate this feature to their snaps?

1 Like

I think we’re still waiting for it to migrate away from requiring --enable-experimental-package-repositories flag, because you can’t specify that on the build service :frowning:

2 Likes

Thanks, I’ve added a note to the documentation.

2 Likes

Issue

Looks like the architectures link for deb properties is broken in two places:

  1. In the Adding repositories bulleted overview
  1. In the Deb properties overview

Solution

Changing the link text for architectures to the following should hopefully fix the issue:

[architectures](#heading--architectures)
1 Like

Thanks so much for this, and for looking into why the link wasn’t working. You were right about the broken link which should be fixed now.

I think it should be mentioned somewhere that using apt repositories from other Debian based distributions can result in GLIBC Version difference in packages resulting in the snap being completely unusable. For e.g, I tried to use Kali Linux repositories in a snap I created because some security tools were not available in Ubuntu repos and it was a bit hard to debug because currently there is no guide/solution for this.

1 Like