pacdef icon indicating copy to clipboard operation
pacdef copied to clipboard

multi-backend declarative package manager for Linux

pytest pep257 bandit black pyright

pacdef

declarative package manager for Arch Linux

Installation

pacdef is available in the AUR as stable release or development version.

Use-case

pacdef allows the user to have consistent packages among multiple Arch machines by managing packages in group files. The group files are maintained outside of pacdef by any VCS.

pacdef importing a package group file creates a symlink to that file in pacdef's config dir, thereby letting pacdef know you want to have the packages in this file on your machine. Then installing all packages from all groups is as simple as pacdef sync. All package operations are executed by your favourite AUR helper.

If you work with multiple Arch installations and have asked yourself "Why do I have the program that I use every day on my other machine not installed here?", then pacdef is the tool for you.

Example

This tree shows my pacdef repository (not the pacdef config dir).

.
├── generic
│   ├── audio
│   ├── base
│   ├── desktop
│   ├── private
│   ├── rust
│   ├── wayland
│   ├── wireless
│   ├── work
│   └── xorg
├── hosts
│   ├── hostname_a
│   ├── hostname_b
│   └── hostname_c
└── pacdef.conf
  • The base group holds all packages I need unconditionally, and includes things like zfs, paru and neovim.
  • In xorg and wayland I have stored the respective graphic servers and DEs.
  • wireless contains tools like iwd and bluez-utils for machines with wireless interfaces.
  • Under hosts I have one file for each machine I use. The filenames match the corresponding hostname. The packages are specific to one machine only, like device drivers, or any programs I use exclusively on that machine.

Usage on different machines:

  • home server: base private hostname_a
  • private PC: audio base desktop private rust wayland hostname_b
  • work PC: base desktop rust work xorg hostname_c

How to use

  • import one or more groups: pacdef import base desktop audio
  • install packages from the imported groups: pacdef sync
  • show packages that are not part of any group: pacdef unmanaged
  • remove packages that are not in any group: pacdef clean
  • show imported groups: pacdef groups
  • remove a previously imported group: pacdef remove audio
  • review all unmanaged packages interactively: pacdef review
  • search for the group that contains a package: pacdef search firefox
  • show packages of a group: pacdef show desktop

Configuration

On first execution, it will create a basic config file under $XDG_CONFIG_HOME/pacdef/pacdef.conf. The program only needs to know your AUR helper of choice. Configure it as follows.

[misc]
aur_helper = paru

package group files

  1. One package per line.
  2. Anything after a # is ignored.
  3. Empty lines are ignored.
  4. If a package exists in multiple repositories, the repo can be specified as prefix followed by a forward slash. The AUR helper must understand this notation.

Example:

# desktop
alacritty
firefox
libreoffice-fresh
mycustomrepo/zsh-theme-powerlevel10k
...