#包管理器 #Arch Linux #声明式 #配置文件

应用 pacdef

适用于 Linux 的多后端声明式包管理器

22 个版本 (14 个稳定版)

1.6.0 2024年4月13日
1.4.2 2024年3月20日
1.3.2 2023年12月26日
1.3.1 2023年10月16日
1.0.0-beta9 2023年2月18日

#68 in 命令行工具

每月下载量 34 次

GPL-3.0-or-later

160KB
3.5K SLoC

check

pacdef

适用于 Linux 的多后端声明式包管理器

安装

Arch Linux

pacdef 在 AUR 中可用,作为稳定版本开发版本二进制版本

其他 Linux 版本的二进制文件

从 1.5.0 版本开始,您可以下载一些其他 Linux 版本的二进制文件。查看最新版本的资产。

从源码安装

使用以下命令从 crates.io 安装。

$ cargo install [-F <backend>[,...]] pacdef

请参见以下部分 (支持的组件) 以获取您需要为您的发行版使用的功能标志。

shell 完成脚本

对于 Arch Linux,当您从 AUR 包安装 pacdef 时,zsh 完成脚本将自动工作。对于其他发行版,您必须手动将 _completion.zsh 文件复制到正确的文件夹,并将其重命名为 _pacdef

用例

pacdef 允许用户通过管理分组文件中的包来在不同 Linux 机器和不同的后端之间保持一致的包。其理念是:(1) 组文件中的任何包("管理的包")都将被明确安装,(2) 明确安装的但未在任何组文件中找到的包("未管理的包")将被删除。组文件由任何版本控制系统(如 git)维护,而不在 pacdef 内部。

如果您使用多个 Linux 机器,并曾问过自己 "为什么我在其他机器上没有安装我每天使用的程序?",那么 pacdef 就是您需要的工具。

关于组、部分和包

pacdef 管理多个包组(组文件),例如,可能与特定的用例相关联。每个组都有一个或多个部分,对应于特定的后端,如您的系统包管理器(pacmanapt 等),或您的编程语言包管理器(cargopip 等)。每个部分包含一个或多个可以由相应的包管理器安装的包。

此图展示了它们之间的关系。

       1   n       1   n         1   n      
pacdef ----> group ----> section ----> package 

示例

假设您有以下组文件。

base:

[arch]
paru
zsh

[rust]
pacdef
topgrade

development:

[arch]
rustup
rust-analyzer

[rust]
cargo-tree
flamegraph

Pacdef 将确保为每个包管理器安装以下包

  • Arch (pacman,AUR 辅助工具):paru、zsh、rustup、rust-analyzer
  • Rust (cargo):pacdef、topgrade、cargo-tree、flamegraph

请注意,部分的名称对应于其相关联的生态系统,而不是使用的包管理器。

支持的后端

目前支持以下后端。欢迎为额外的后端提交拉取请求!

应用 包管理器 部分 特性标志 说明
Arch Linux pacman [arch] arch 包括 pacman 包装的 AUR 辅助工具(可配置)
Debian apt [debian] debian 最低支持的 apt 版本 2.0.2 (查看上游
Flatpak flatpak [flatpak] 内置 可以管理系统范围内的或每个用户的安装(可配置)
Python pip [python] 内置
Rust cargo [rust] 内置
Rustup rustup [rustup] 内置 有关组文件中包的语法的注释请见下文。
Void Linux xbps [void] 内置

具有 特性标志 的后端需要在构建过程中设置相应的标志。适当的系统库及其头文件必须存在于机器上,并且可以被 pkg-config 检测到。对于声明“内置”的后端,在编译时始终支持。任何后端都可以在运行时禁用(见下文,“配置”)。

例如,要构建支持 Debian Linux 的 pacdef,可以运行以下两个命令之一。

  • (推荐)cargo install -F debian pacdef,这将从 https://crates.io 下载并构建它
  • 在一个此仓库的克隆中,cargo install --path . -F debian

示例

此树显示了我的 pacdef 仓库(不是 pacdef 配置目录)。

.
├── generic
│   ├── audio
│   ├── base
│   ├── desktop
│   ├── private
│   ├── rust
│   ├── wayland
│   ├── wireless
│   ├── work
│   └── xorg
├── hosts
│   ├── hostname_a
│   ├── hostname_b
│   └── hostname_c
└── pacdef.yaml
  • base 组包含我无条件需要的所有包,包括 zfs、paruneovim
  • xorgwayland 中,我存储了相应的图形服务器和 DE。
  • wireless 包含无线接口机器的工具,如 iwdbluez-utils
  • hosts 下,我为每台我使用的机器有一个文件。文件名与相应的主机名匹配。这些包仅针对一台机器特定,如设备驱动程序,或我在该机器上专用的任何程序。

不同机器上的使用

  • 家庭服务器: base private hostname_a
  • 私人电脑: audio base desktop private rust wayland hostname_b
  • 工作电脑: base desktop rust work xorg hostname_c

命令

子命令 描述
group import[<路径>...] 在您的groups文件夹中创建指向指定组文件的符号链接
group export[参数] <group> ... 导出(移动)非符号链接的组,并将其作为符号链接重新导入
group list 列出所有组的名称
group new[-e] [<group>...] 创建新组,使用-e在创建后立即编辑它们
group remove[<group>...] 删除之前导入的组
group show[<group>...] 显示组的内容
package clean[--noconfirm] 删除所有未管理的软件包
package review 针对每个未管理的软件包交互式决定要执行的操作
package search<regex> 搜索与搜索字符串匹配的管理软件包
package sync[--noconfirm] 安装管理软件包
package unmanaged 显示所有未管理的软件包
version 显示版本信息,支持的后端

别名

大多数子命令都有别名。例如,您可以使用pacdef package sync而不是pacdef p sypacdef group show将变为pacdef g s

使用--help或zsh自动完成来查找正确的别名。

配置

首次运行时,它将在$XDG_CONFIG_HOME/pacdef/pacdef.yaml下创建一个空配置文件。以下是可以设置的关键值对。列出的值是默认值。

aur_helper: paru  # AUR helper to use on Arch Linux (paru, yay, ...)
aur_rm_args: []  # additional args to pass to AUR helper when removing packages (optional)
disabled_backends: []  # backends that pacdef should not manage, e.g. ["python"], this can reduce runtime if the package manager is notoriously slow (like pip)

warn_not_symlinks: true  # warn if a group file is not a symlink
flatpak_systemwide: true  # whether flatpak packages should be installed system-wide or per user
pip_binary: pip  # choose whether to use pipx instead of pip for python package management (see below, 'pitfalls while using pipx')

组文件语法

组文件大致遵循ini文件的语法。

  1. 部分以括号中的名称开始。
  2. 每行一个软件包。
  3. 任何在#后面的内容都将被忽略。
  4. 空行将被忽略。
  5. 如果软件包存在于多个仓库中,仓库可以指定为前缀,后跟正斜杠。软件包管理器必须理解这种表示法。

示例

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

[rust]
cargo-update
topgrade

Rustup

Rustup软件包的管理方式相当不同。有关语法,请参阅下面。与其他软件包管理器不同,rustup对软件包命名的处理方式非常不同。这些软件包的形式可以是toolchain/<VERSION>component/<VERSION>/<component>,其中可以是稳定版、夜间版或任何显式rust版本。必须将<component>字段替换为您想要安装的组件的名称。

示例

[rustup]
component/stable/rust-analyzer
toolchain/stable
component/stable/cargo
component/stable/rust-src
component/stable/rustc
toolchain/1.70.0
component/1.70.0/cargo
component/1.70.0/clippy
component/1.70.0/rust-docs
component/1.70.0/rust-src
component/1.70.0/rust-std
component/1.70.0/rustc
component/1.70.0/rustfmt

杂项

自动化

Pacdef由topgrade支持。

命名

pacdef结合了“package”和“define”这两个词。

最低支持的rust版本(MSRV)

由于需要此特定版本的依赖项,MSRV为1.74。开发针对最新稳定版进行。

使用pipx时的陷阱

一些包如 mdformat-myst 并不自己提供可执行文件,而是作为依赖(在这种情况下是mdformat)的插件存在。请通过运行以下命令显式安装此类包:pipx install <-名称> --include-deps

依赖项

~7–20MB
~239K SLoC