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 |
|
#68 in 命令行工具
每月下载量 34 次
160KB
3.5K SLoC
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
管理多个包组(组文件),例如,可能与特定的用例相关联。每个组都有一个或多个部分,对应于特定的后端,如您的系统包管理器(pacman
、apt
等),或您的编程语言包管理器(cargo
、pip
等)。每个部分包含一个或多个可以由相应的包管理器安装的包。
此图展示了它们之间的关系。
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、paru 和 neovim。- 在
xorg
和wayland
中,我存储了相应的图形服务器和 DE。 wireless
包含无线接口机器的工具,如iwd
和bluez-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 sy
,pacdef 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
文件的语法。
- 部分以括号中的名称开始。
- 每行一个软件包。
- 任何在
#
后面的内容都将被忽略。 - 空行将被忽略。
- 如果软件包存在于多个仓库中,仓库可以指定为前缀,后跟正斜杠。软件包管理器必须理解这种表示法。
示例
[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