2023-02-15 16:11:02 +01:00
2023-02-13 22:49:09 +01:00
2023-01-12 23:07:27 +01:00
2023-02-15 14:16:40 +01:00
2023-02-15 14:16:40 +01:00
2023-02-15 11:15:49 +01:00

pacdef

multi-backend declarative package manager for Linux

Installation

pacdef is available in the AUR as stable release or development version, and on crates.io.

Use-case

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

If you work with multiple Linux machines 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.

Supported backends

At the moment, supported backends are limited to the following.

Package Manager Section Application Notes
pacman arch Arch Linux includes pacman-wrapping AUR helpers (configurable)
cargo rust Rust

Pull requests for additional backends are welcome!

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
  • create a new group: pacdef new temp (use new -e to edit the file right away)
  • 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

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 the respective package managers.

Configuration

On first execution, it will create a basic config file under $XDG_CONFIG_HOME/pacdef/pacdef.yaml.

aur_helper: paru  # AUR helper to use on Arch Linux (paru, yay, ...)
aur_rm_args: null  # additional args to pass to AUR helper when removing packages (optional)
warn_not_symlinks: true  # warn if a group file is not a symlink

Package group files

Group files loosely follow the syntax for ini-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:

[pacman]
alacritty
firefox  # this comment is ignored
libreoffice-fresh
mycustomrepo/zsh-theme-powerlevel10k

[rust]
cargo-update
topgrade

Naming

pacdef combines the words "package" and "define".

S
Description
No description provided
Readme GPL-3.0
1.9 MiB
Languages
Rust 96.7%
Shell 3.3%