Adding a Package Repository
Spack comes with thousands of built-in package recipes where each recipe resides in a package repository. By default, all packages
are placed in
builtin is a package repository. Spack searches the repositories when it needs to find a package by name.
You may need to maintain packages for restricted, proprietary, or experimental software, which don’t affect the built-in repository.
Spack allows you to configure local repositories using either the
repos.yaml file or the
spack repo command.
Package repositories allow you to:
Maintain your own packages individually from Spack.
Share your packages without committing them to the built-in Spack package repository.
Override built-in Spack packages with your own implementation.
For more details, check the Spack Documentation.
Spack allows users to create new package repositories and use them to maintain packages. The following is the general syntax for adding a new package repository:
spack repo create <package_name>
For example, to create a repository called
$SPACK_ROOT/var/Spack/repos, you type:
spack repo create $SPACK_ROOT/var/spack/repos/myproject
Spack uses the
repos.yaml file, which is stored in
$SPACK_ROOT/etc/spack/defaults/, to find repositories. The file by default looks like:
repos: - $spack/var/spack/repos/builtin
The file starts with
repos: and contains the list of paths to repositories.
The current file contains only one path, which starts with
- represents an item of a list.
You can add a repository by inserting another path in a new line. For example, to add
you first copy the
repos.yaml file from
cp $SPACK_ROOT/etc/spack/defaults/repos.yaml ~/.spack
Then, you edit
repos.yaml and add the path as follows:
Then you add the path
$SPACK_ROOT/var/spack/repos/myproject to the file.
repos: - $spack/var/spack/repos/builtin - $SPACK_ROOT/var/spack/repos/myproject
When you try to install a package, Spack searches these repositories in order (first to last) to resolve each package name.
For example, to install
mpich, Spack will look for the following packages based on the
repos.yaml and use the first valid file:
When you create a new package repository, it will be associated with a namespace. By default, the namespace will be the same as the name of the repository.
For example, the
myproject repository has
myproject namespace. To find the namespace of a repository, you can show the
repo.yaml file which is located in the package repository.
For instance, to show
repo.yaml of the
myproject repository, you type:
The following output shows that
myproject is the namespace of the
repo: namespace: 'myproject'
Spack records the repository namespace of each installed package. For example, if you install the
mpich package from the
Spack records its fully qualified name as
As stated before, each created repository has a default namespace that’s the same as the repository’s name.
Sometimes you may create different repositories in different locations with the same name. This means that you may have more than a repository with the same namespace.
Spack requires you to choose a namespace that uniquely identifies your package repository.
For example, you can create a repository for packages to be used in your project, and you could use your project name as the namespace. You can also nest namespaces using periods.
Alternatively, you might use
discovery.hpcteams as a namespace for your repository.
Once you have created a package, you can register it with Spack using the
spack repo add command:
spack repo add <Repo_Path>
Repo_Path is the path to the created repository. For example, to add the
myproject repository, you type:
spack repo add $SPACK_ROOT/var/spack/repos/myproject
==> Added repo with namespace 'myproject'.
You can remove an already-registered repository using the
spack repo remove command as follows:
spack repo remove <path_or_namespace>
You can either use the path or the namespace of the repository.
For example, to remove
myproject from Spack, type:
spack repo remove $SPACK_ROOT/var/spack/repos/myproject
spack repo remove myproject