pacman-debian 7.3.11 → 7.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -504
- package/README_zh-CN.md +35 -489
- package/dist/ar.d.ts +8 -0
- package/dist/cli/archlinux-java.d.ts +3 -0
- package/dist/cli/fix_default.d.ts +3 -0
- package/dist/cli/paclink.d.ts +3 -0
- package/dist/cli/pacman.d.ts +2 -0
- package/dist/cli/update-ca-trust.d.ts +3 -0
- package/dist/compress.d.ts +2 -0
- package/dist/config.d.ts +3 -0
- package/dist/control.d.ts +2 -0
- package/dist/core/ar.d.ts +7 -0
- package/dist/core/compress.d.ts +4 -0
- package/dist/core/control.d.ts +2 -0
- package/dist/core/deb.d.ts +4 -0
- package/dist/core/deps.d.ts +28 -0
- package/dist/core/options.d.ts +19 -0
- package/dist/core/pkgfile.d.ts +35 -0
- package/dist/core/tar.d.ts +13 -0
- package/dist/core/types.d.ts +83 -0
- package/dist/database.d.ts +20 -0
- package/dist/db/database.d.ts +17 -0
- package/dist/db/dpkg-compat.d.ts +19 -0
- package/dist/db/localdb.d.ts +9 -0
- package/dist/db/sqlite.d.ts +20 -0
- package/dist/deb.d.ts +5 -0
- package/dist/dpkg-compat.d.ts +18 -0
- package/dist/i18n/index.d.ts +4 -0
- package/dist/i18n/paclink/en.d.ts +3 -0
- package/dist/i18n/paclink/zh-CN.d.ts +3 -0
- package/dist/i18n/setup/en.d.ts +3 -0
- package/dist/i18n/setup/zh-CN.d.ts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/install.d.ts +2 -0
- package/dist/makepkg/build.d.ts +19 -0
- package/dist/makepkg/index.d.ts +3 -0
- package/dist/makepkg/pkgbuild.d.ts +36 -0
- package/dist/ops/install.d.ts +5 -0
- package/dist/ops/query.d.ts +9 -0
- package/dist/ops/remove.d.ts +4 -0
- package/dist/ops/upgrade.d.ts +4 -0
- package/dist/pacman.d.ts +2 -0
- package/dist/query.d.ts +5 -0
- package/dist/remove.d.ts +2 -0
- package/dist/repo/config.d.ts +3 -0
- package/dist/repo/repository.d.ts +20 -0
- package/dist/repository.d.ts +10 -0
- package/dist/scripts/pacman-conf.d.ts +3 -0
- package/dist/scripts/setup.d.ts +3 -0
- package/dist/tar.d.ts +17 -0
- package/dist/types.d.ts +80 -0
- package/dist/ui/colors.d.ts +13 -0
- package/dist/ui/format.d.ts +3 -0
- package/dist/ui/progress.d.ts +8 -0
- package/dist/ui/prompt.d.ts +4 -0
- package/docs/en/architecture.md +188 -0
- package/docs/en/configuration.md +84 -0
- package/docs/en/installation.md +67 -0
- package/docs/en/makepkg.md +38 -0
- package/docs/en/paclink.md +73 -0
- package/docs/en/usage.md +91 -0
- package/docs/en/yay-aur.md +65 -0
- package/docs/zh-CN/architecture.md +171 -0
- package/docs/zh-CN/configuration.md +80 -0
- package/docs/zh-CN/installation.md +65 -0
- package/docs/zh-CN/makepkg.md +32 -0
- package/docs/zh-CN/paclink.md +70 -0
- package/docs/zh-CN/usage.md +90 -0
- package/docs/zh-CN/yay-aur.md +44 -0
- package/lib/pac4deb/Makefile +26 -0
- package/lib/pac4deb/README.md +47 -0
- package/lib/pac4deb/include/alpm.h +166 -0
- package/lib/pac4deb/include/alpm_list.h +43 -0
- package/lib/pac4deb/src/alpm_list.c +120 -0
- package/lib/pac4deb/src/genstubs.sh +51 -0
- package/lib/pac4deb/src/genstubs2.sh +72 -0
- package/lib/pac4deb/src/genstubs3.sh +43 -0
- package/lib/pac4deb/src/libalpm.c +964 -0
- package/lib/pac4deb/src/stubs_manual.c +452 -0
- package/package.json +19 -1
package/README_zh-CN.md
CHANGED
|
@@ -18,46 +18,19 @@
|
|
|
18
18
|
|
|
19
19
|
### 项目状态
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- **依赖解析**:顺序 BFS + idx 内存缓存 + provides 倒排索引,亚秒级
|
|
25
|
-
依赖查找。删除时正确处理孤儿级联和 conffile 备份。
|
|
26
|
-
- **性能优化**:`packages.idx` 索引实现亚秒级单包查找。`-Ss` 只扫索引
|
|
27
|
-
(不解析 JSON)。全量 `-Sl` 通过索引 seek。HTTP keep-alive agent
|
|
28
|
-
复用 TCP 连接,异步 zlib 解压不阻塞事件循环。
|
|
29
|
-
- **并行同步**:多仓库并发下载,每仓库独立进度行。HTTP 条件请求(304)
|
|
30
|
-
跳过未变更仓库。Debian 组件串行但多仓库并行。
|
|
31
|
-
- **多语言**:通过 `$LANG` 自动切换中英文。同步、安装、升级流程均已
|
|
32
|
-
本地化。消息目录在 `src/i18n/`。
|
|
33
|
-
- **颜色输出**:遵守 `pacman.conf` 的 `Color` 选项。颜色方案匹配官方
|
|
34
|
-
pacman(品红=仓库、绿=包名、红=错误)。
|
|
35
|
-
- **权限分离**:查询命令(`-Q`、`-Ss`、`-Si`、`-Sp`、`-Rp`)无需 root。
|
|
36
|
-
写操作需要 `sudo`。
|
|
37
|
-
- **链接系统**(`paclink`):Debian→Arch 虚拟包名映射以本地 DB 条目存储
|
|
38
|
-
(`repoType: link`)。仓库真包自动优先于链接,安装时覆盖。
|
|
39
|
-
链接仅对 pacman/libalpm 可见,dpkg 不可见。
|
|
40
|
-
- **作用域 i18n**:每个工具(pacman、paclink、setup)首次使用时才加载自己的
|
|
41
|
-
翻译文件,减少冷启动开销。语言:en、zh-CN。
|
|
42
|
-
|
|
43
|
-
主要限制:
|
|
44
|
-
|
|
45
|
-
- **Arch ARM 二进制仓库需要 glibc 2.38+** — Debian 12 自带 2.36。
|
|
46
|
-
本地 `makepkg` 构建可正常使用。
|
|
47
|
-
- **yay/AUR**:libalpm 桩库支持包搜索和依赖解析,但复杂 AUR 依赖链
|
|
48
|
-
可能因 Debian/Arch 包名差异而失败。
|
|
49
|
-
- **AUR 助手集成**仅测试了 yay(paru、pamac 等未测试)。
|
|
21
|
+
可用于基于 Debian 发行版的日常包管理。
|
|
22
|
+
详见[项目状态](docs/zh-CN/architecture.md#项目状态)。
|
|
50
23
|
|
|
51
24
|
## 安装
|
|
52
25
|
|
|
53
26
|
### 环境要求
|
|
54
27
|
|
|
55
|
-
- Node.js 18
|
|
56
|
-
- Debian
|
|
57
|
-
-
|
|
28
|
+
- Node.js 18+
|
|
29
|
+
- Debian 系发行版(Debian、Ubuntu、Armbian、Linux Mint 等)
|
|
30
|
+
- 写操作需要 root 权限
|
|
58
31
|
- 编译工具:`gcc`、`make`、`ldconfig`
|
|
59
32
|
|
|
60
|
-
###
|
|
33
|
+
### 安装
|
|
61
34
|
|
|
62
35
|
```bash
|
|
63
36
|
npm install -g pacman-debian@latest
|
|
@@ -65,20 +38,11 @@ sudo $(which pacman-debian-setup)
|
|
|
65
38
|
```
|
|
66
39
|
|
|
67
40
|
> [!WARNING]
|
|
68
|
-
>
|
|
69
|
-
>
|
|
70
|
-
|
|
71
|
-
安装脚本将:
|
|
72
|
-
1. 创建默认配置文件 `/etc/pacman-debian/pacman.conf`
|
|
73
|
-
2. 创建 `/etc/pacman.conf` → `/etc/pacman-debian/pacman.conf` 符号链接
|
|
74
|
-
3. 创建所有 CLI 符号链接(`/usr/local/bin/pacman` 等)
|
|
75
|
-
4. 创建 `/var/lib/pacman` → `/var/lib/pacman-debian` 符号链接(fastfetch 检测用)
|
|
76
|
-
5. 安装 Arch 兼容工具(`update-ca-trust`、`archlinux-java`、`fix_default`)
|
|
77
|
-
6. 安装 Arch 兼容 shell 函数(`/etc/profile.d/append_path.sh`)
|
|
78
|
-
7. 在 dpkg 状态中注册虚拟 `pacman` 包
|
|
79
|
-
8. 创建默认 paclink 映射(sh → bash、python → python3 等)
|
|
41
|
+
> `npm install -g` **必须**在 `sudo` 或 `root` 用户下运行。
|
|
42
|
+
> 如果使用普通用户安装,Node.js 会将包安装到用户家目录(`~/.npm-global/` 等),
|
|
43
|
+
> 存在被其他用户或脚本篡改、植入恶意内容的风险。请始终使用 `sudo npm install -g`。
|
|
80
44
|
|
|
81
|
-
|
|
45
|
+
安装后:
|
|
82
46
|
|
|
83
47
|
```bash
|
|
84
48
|
sudo pacman -Sy
|
|
@@ -88,464 +52,46 @@ sudo pacman -S neofetch
|
|
|
88
52
|
### 开发安装
|
|
89
53
|
|
|
90
54
|
```bash
|
|
91
|
-
git clone https://github.com/
|
|
55
|
+
git clone https://github.com/xbodwf/pacman-debian.git
|
|
92
56
|
cd pacman-debian
|
|
93
|
-
pnpm install
|
|
94
|
-
pnpm build # tsc + C 库
|
|
95
|
-
# 或分步执行:
|
|
96
|
-
pnpm exec tsc
|
|
97
|
-
make -C lib/pac4deb # 构建 libalpm.so
|
|
98
|
-
|
|
99
|
-
# 运行安装脚本
|
|
57
|
+
pnpm install && pnpm build
|
|
100
58
|
sudo node dist/scripts/setup.js
|
|
101
|
-
|
|
102
|
-
# 或手动设置:
|
|
103
|
-
sudo ln -sf "$PWD/dist/cli/pacman.js" /usr/local/bin/pacman
|
|
104
|
-
sudo ln -sf "$PWD/dist/cli/paclink.js" /usr/local/bin/paclink
|
|
105
|
-
sudo ln -sf "$PWD/dist/scripts/pacman-conf.js" /usr/local/bin/pacman-conf
|
|
106
|
-
sudo ln -sf "$PWD/dist/makepkg/index.js" /usr/local/bin/makepkg
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## 配置
|
|
110
|
-
|
|
111
|
-
配置文件:`/etc/pacman-debian/pacman.conf`
|
|
112
|
-
|
|
113
|
-
配置使用纯 Arch Linux pacman 语法,支持 `Include` 指令。仓库特有键
|
|
114
|
-
(`Type`、`Dist`、`Components` 等)放在 `/etc/pacman.d/` 的包含文件中。
|
|
115
|
-
|
|
116
|
-
配置示例:
|
|
117
|
-
|
|
118
|
-
```ini
|
|
119
|
-
[options]
|
|
120
|
-
Architecture = auto
|
|
121
|
-
|
|
122
|
-
[bookworm]
|
|
123
|
-
Include = /etc/pacman.d/debian-bookworm
|
|
124
|
-
|
|
125
|
-
[extra]
|
|
126
|
-
Include = /etc/pacman.d/arch-extra
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
包含文件示例(`/etc/pacman.d/debian-bookworm`):
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
Server = https://mirrors.tuna.tsinghua.edu.cn/debian
|
|
133
|
-
Type = debian
|
|
134
|
-
Dist = bookworm
|
|
135
|
-
Components = main contrib non-free non-free-firmware
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
Arch 仓库的包含文件(`/etc/pacman.d/arch-extra`):
|
|
139
|
-
|
|
140
|
-
```
|
|
141
|
-
Server = http://mirror.archlinuxarm.org/$arch/$repo
|
|
142
|
-
Type = arch
|
|
143
|
-
Architecture = auto
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
安装时会创建 `/etc/pacman.conf` → `/etc/pacman-debian/pacman.conf` 符号链接,
|
|
147
|
-
以便硬编码该路径的工具(如 yay)正常工作。
|
|
148
|
-
|
|
149
|
-
使用 `pacman-conf` 查看解析后的配置(所有 `Include` 文件已展开,
|
|
150
|
-
`$repo`/`$arch` 变量已替换):
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
$ pacman-conf
|
|
154
|
-
# pacman-debian configuration
|
|
155
|
-
[options]
|
|
156
|
-
Architecture = auto
|
|
157
|
-
|
|
158
|
-
[bookworm]
|
|
159
|
-
Server = https://mirrors.tuna.tsinghua.edu.cn/debian
|
|
160
|
-
Type = debian
|
|
161
|
-
Dist = bookworm
|
|
162
|
-
Components = main contrib non-free non-free-firmware
|
|
163
|
-
|
|
164
|
-
[extra]
|
|
165
|
-
Server = http://mirror.archlinuxarm.org/$arch/$repo
|
|
166
|
-
Type = arch
|
|
167
|
-
Architecture = auto
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### 配置选项
|
|
171
|
-
|
|
172
|
-
| 选项 | 说明 |
|
|
173
|
-
|------|------|
|
|
174
|
-
| `Color` | 启用彩色输出(放在 `[options]` 段) |
|
|
175
|
-
| `Architecture` | 设置目标架构(默认 `auto`) |
|
|
176
|
-
| `IgnorePkg` | 跳过指定包的升级 |
|
|
177
|
-
|
|
178
|
-
## 架构
|
|
179
|
-
|
|
180
|
-
### 源文件结构
|
|
181
|
-
|
|
182
|
-
```
|
|
183
|
-
src/
|
|
184
|
-
├── cli/
|
|
185
|
-
│ ├── pacman.ts # CLI 参数解析和分发
|
|
186
|
-
│ ├── paclink.ts # 虚拟包链接管理
|
|
187
|
-
│ ├── update-ca-trust.ts # Arch 兼容 CA 证书更新器
|
|
188
|
-
│ ├── archlinux-java.ts # Arch 兼容 Java 环境管理器
|
|
189
|
-
│ └── fix_default.ts # Arch 兼容默认 JDK 助手
|
|
190
|
-
├── core/ # 包格式解析器、依赖引擎
|
|
191
|
-
│ ├── ar.ts # ar 归档解析器
|
|
192
|
-
│ ├── tar.ts # tar 提取器
|
|
193
|
-
│ ├── deb.ts # .deb 包解析器
|
|
194
|
-
│ ├── pkgfile.ts # .pkg.tar.zst 解析器
|
|
195
|
-
│ ├── compress.ts # gz/xz 解压缩
|
|
196
|
-
│ ├── control.ts # Debian control 文件解析器
|
|
197
|
-
│ └── deps.ts # 依赖解析引擎
|
|
198
|
-
├── db/
|
|
199
|
-
│ ├── localdb.ts # 目录式本地包数据库
|
|
200
|
-
│ ├── database.ts # 带事务的 DB 封装
|
|
201
|
-
│ └── dpkg-compat.ts # dpkg 状态文件读写
|
|
202
|
-
├── ops/
|
|
203
|
-
│ ├── install.ts # 包安装
|
|
204
|
-
│ ├── remove.ts # 包删除
|
|
205
|
-
│ ├── query.ts # 所有 -Q 查询
|
|
206
|
-
│ └── upgrade.ts # 同步 + 升级流程
|
|
207
|
-
├── repo/
|
|
208
|
-
│ ├── repository.ts # 仓库同步、下载、JSONL 缓存
|
|
209
|
-
│ └── config.ts # pacman.conf 解析器(支持 Include)
|
|
210
|
-
├── scripts/
|
|
211
|
-
│ └── setup.ts # 交互式安装脚本
|
|
212
|
-
├── makepkg/
|
|
213
|
-
│ ├── index.ts # makepkg 主入口
|
|
214
|
-
│ ├── pkgbuild.ts # PKGBUILD 解析器
|
|
215
|
-
│ ├── source.ts # 源码下载/解压
|
|
216
|
-
│ ├── build.ts # build()/package() 执行
|
|
217
|
-
│ └── printsrcinfo.ts # .SRCINFO 生成
|
|
218
|
-
├── ui/ # 用户界面(提示、格式化)
|
|
219
|
-
└── index.ts # 入口
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
lib/pac4deb/ # libalpm C 库
|
|
224
|
-
├── Makefile # 用 gcc 构建,目标 libalpm.so
|
|
225
|
-
├── include/
|
|
226
|
-
│ ├── alpm.h # 公共 libalpm API 头文件
|
|
227
|
-
│ └── alpm_list.h # 链表头文件
|
|
228
|
-
└── src/
|
|
229
|
-
├── libalpm.c # 核心实现(handle、db、pkg、JSON 解析器)
|
|
230
|
-
├── stubs_manual.c # ~200 个不常用 libalpm 函数的桩实现
|
|
231
|
-
└── alpm_list.c # 链表实现
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
### 数据库
|
|
235
|
-
|
|
236
|
-
#### 本地数据库:`/var/lib/pacman-debian/local/`
|
|
237
|
-
|
|
238
|
-
采用与 Arch Linux 本地 DB 一致的目录-包格式:
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
/var/lib/pacman-debian/local/
|
|
242
|
-
├── index.json # 包名 → 目录映射(base64 编码路径)
|
|
243
|
-
├── by-name/
|
|
244
|
-
│ ├── fastfetch -> ../fastfetch-2.64.2-2/
|
|
245
|
-
│ └── ...
|
|
246
|
-
├── fastfetch-2.64.2-2/
|
|
247
|
-
│ ├── desc # JSON 元数据(名称、版本、依赖、大小等)
|
|
248
|
-
│ └── files # 文件清单
|
|
249
|
-
└── ...
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
`index.json` 以 `name:base64path` 格式逐行记录包名到目录的映射,是删除和查询
|
|
253
|
-
的首选查找路径。若文件缺失或损坏会自动从文件系统重建。
|
|
254
|
-
|
|
255
|
-
#### dpkg 兼容
|
|
256
|
-
|
|
257
|
-
通过 `dpkg` 或 `apt` 安装的包在查询时直接从 `/var/lib/dpkg/status` 读取
|
|
258
|
-
(按 mtime 缓存)。`pacman-debian` 安装包时会同时写入 dpkg 兼容的条目,
|
|
259
|
-
确保 `apt` 和 `dpkg` 仍能识别该包。
|
|
260
|
-
|
|
261
|
-
#### 仓库缓存:`/var/cache/pacman-debian/packages/`
|
|
262
|
-
|
|
263
|
-
每个仓库以 JSON Lines 块形式缓存(每个 `.jsonl` 文件 5000 个包)。
|
|
264
|
-
同步时还会生成全局排序的 `packages.idx` 索引,格式:
|
|
265
|
-
`包名 描述\tprovides\t分块文件\t字节偏移`
|
|
266
|
-
|
|
267
|
-
```
|
|
268
|
-
/var/cache/pacman-debian/packages/
|
|
269
|
-
├── bookworm/
|
|
270
|
-
│ ├── 00000.jsonl # JSON Lines, ~5000 包/块
|
|
271
|
-
│ ├── ...
|
|
272
|
-
│ ├── packages.idx # 全局排序索引 (~200KB)
|
|
273
|
-
│ └── .info # 元数据(总数、块数)
|
|
274
|
-
└── ...
|
|
275
59
|
```
|
|
276
60
|
|
|
277
|
-
|
|
61
|
+
详见[安装说明](docs/zh-CN/installation.md)。
|
|
278
62
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
```
|
|
282
|
-
_idxCache = new Map<string, IdxEntry>();
|
|
283
|
-
IdxEntry { lines: string[], mtime: number, providesIndex: Map<string, Array<{chunkFile, offset}>> }
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
- 后续 `-S`/`-Ss`/`-Sl` 操作直接读内存,不重复读盘
|
|
287
|
-
- `providesIndex` 是倒排索引:`provides 名 → [{ chunkFile, offset }]`
|
|
288
|
-
- `findProvider()` 查 provides 时 O(1) `Map.get()`,无需扫文件
|
|
289
|
-
- `pacman -Syy` 清空缓存(调用 `invalidateIdxCache()`)
|
|
290
|
-
- 增量同步后 idx 文件 mtime 变化,自动重新加载
|
|
291
|
-
|
|
292
|
-
#### 查找路径
|
|
293
|
-
|
|
294
|
-
| 操作 | 方法 | 说明 |
|
|
295
|
-
|------|------|------|
|
|
296
|
-
| `-S <pkg>` / `-Qo` | 二分搜索 `packages.idx` → seek JSONL | O(log N),单行读取 |
|
|
297
|
-
| `-Ss` | 逐行扫 `packages.idx`(包名+描述)→ seek JSONL | ~1.4MB 扫描,不解析 JSON |
|
|
298
|
-
| `-Sl` | 扫 `packages.idx` → seek 每个包 | 通过索引懒加载 |
|
|
299
|
-
| 依赖 provides | 扫 `packages.idx` provides 字段 | 仅索引,不解析 JSON |
|
|
300
|
-
| `-Qi` / `-Ql` | dpkg 状态或本地数据库 | 不涉及缓存 |
|
|
301
|
-
|
|
302
|
-
### 仓库支持
|
|
303
|
-
|
|
304
|
-
- **Debian/Ubuntu**:从标准仓库索引读取 `Packages.gz` / `Packages.xz`。
|
|
305
|
-
支持 `Server` URL 中的 `$repo`/`$arch` 变量替换。
|
|
306
|
-
- **Arch Linux**:从 Arch 兼容仓库读取 `db.tar.gz`。下载的 `.pkg.tar.zst`
|
|
307
|
-
文件会被解包并安装。
|
|
308
|
-
- **Arch ARM**:二进制包需要 glibc 2.38+ — Debian 12 自带 glibc 2.36,
|
|
309
|
-
因此在 Bookworm 上 Arch ARM 二进制仓库**无法使用**(升级 glibc 会损坏系统)。
|
|
310
|
-
请改用 `makepkg` 进行本地编译。
|
|
311
|
-
|
|
312
|
-
### libalpm C 库(libpac4deb)
|
|
313
|
-
|
|
314
|
-
位于 `lib/pac4deb/` 的 C 库,实现了 libalpm ABI(`alpm.h`),使基于 Go 的
|
|
315
|
-
AUR 助手(如 yay)无需修改即可在 Debian 上运行。它读取:
|
|
316
|
-
|
|
317
|
-
- 本地数据库(`/var/lib/pacman-debian/local/`)— pacman-debian 安装的包
|
|
318
|
-
- dpkg 状态(`/var/lib/dpkg/status`)— apt/dpkg 的系统包
|
|
319
|
-
- 同步数据库(`/var/cache/pacman-debian/packages/*/` — JSONL 块)
|
|
320
|
-
|
|
321
|
-
提供了 200+ 个不常用函数的桩实现。
|
|
322
|
-
|
|
323
|
-
关键实现细节:
|
|
324
|
-
|
|
325
|
-
- **packages.idx 二分查找(C)**:`alpm_db_get_pkg` 和 `alpm_find_dbs_satisfier`
|
|
326
|
-
对排序索引做二分查找,然后按字节偏移读取单行 JSONL——不加载全部 JSONL。
|
|
327
|
-
- **自动注册 sync DB**:`ensure_syncdbs` 在首次调用 `alpm_get_syncdbs` 时扫描
|
|
328
|
-
`/var/cache/pacman-debian/packages/`,懒加载注册所有可用仓库。
|
|
329
|
-
- **包 DB 指针**:`pkg_internal.db` 字段记录所属数据库;`alpm_pkg_get_db` 返回它,
|
|
330
|
-
防止 `DB().Name()` 空指针崩溃。
|
|
331
|
-
- **基于 idx 的搜索**:`alpm_db_search` 扫描索引行做模式匹配,而非加载全部包。
|
|
332
|
-
6 仓库/15000 包的情况下 `-Ss` 约 1.5 秒。
|
|
333
|
-
- **dpkg Provides 解析**:`load_dpkg_status` 读取 dpkg status 的 `Provides:` 字段,
|
|
334
|
-
使声明了虚拟包名的 Debian 包(如 `7zip` → `p7zip`)能被 yay 通过 `alpm_pkg_has_provide` 发现。
|
|
335
|
-
- **本地 DB 后备搜索**:`alpm_find_dbs_satisfier` 在 sync DB 搜索失败后搜索本地数据库
|
|
336
|
-
(通过 `alpm_find_satisfier`),同时匹配包名和 provides——
|
|
337
|
-
使 yay 能通过 `libgnutls30t64` 的映射 provides 找到 `gnutls`。
|
|
338
|
-
- **find_in_idx provides 扫描**:包名二分查找失败后扫描 `packages.idx` 的 provides 列,
|
|
339
|
-
匹配 sync DB 中的虚拟提供(如 Arch 仓库中 `libz.so` → `zlib`)。
|
|
340
|
-
- **dpkg -S 后备**:对于找不到的 `lib*.so` SONAME,通过 `dpkg -S` 在运行时查归属。
|
|
341
|
-
- **Debian alternatives**:加载本地 DB 时检测 `/etc/alternatives/` 中的
|
|
342
|
-
`sh`、`awk`、`vi`、`editor` 等,自动为归属包添加虚拟 provides。
|
|
343
|
-
|
|
344
|
-
### 依赖引擎
|
|
345
|
-
|
|
346
|
-
依赖解析器(`src/core/deps.ts`)支持:
|
|
347
|
-
|
|
348
|
-
- 带版本约束的包名解析(`>=`、`<=`、`=`)
|
|
349
|
-
- OR 依赖(`|`)
|
|
350
|
-
- 架构限定符(如 `:arm64`、`:amd64`)
|
|
351
|
-
- Debian(逗号分隔)和 Arch(空格分隔)两种格式
|
|
352
|
-
- BFS 解析,带预加载 DB 状态
|
|
353
|
-
- 已安装和待安装包之间的冲突检测
|
|
354
|
-
- 系统包保护(glibc、libc6 等)
|
|
355
|
-
- `upgradeMode`:升级时依赖基准为"已安装版本",而非"仓库最新版本"
|
|
356
|
-
|
|
357
|
-
- **文件验证**:已安装的包如果磁盘上没有真实文件(只剩空目录),视为未安装,
|
|
358
|
-
强制重新下载。
|
|
359
|
-
- **显式目标始终处理依赖**:即使目标已安装,也会遍历其依赖检查缺失项。
|
|
360
|
-
- **队列出队**:依赖队列用 `shift()` 弹出已处理项,防止内存堆积。
|
|
361
|
-
|
|
362
|
-
#### 性能优化
|
|
363
|
-
|
|
364
|
-
| 技术 | 说明 |
|
|
365
|
-
|------|------|
|
|
366
|
-
| **idx 内存缓存** | `findInRepo()` 二分搜索直接在 `_idxCache` 的 `lines[]` 上进行,无需读文件(`src/repo/repository.ts:58`) |
|
|
367
|
-
| **provides 倒排索引** | `providesIndex` 在 idx 加载时构建,`findProvider()` 直接 `Map.get()`,O(1) 定位(`src/repo/repository.ts:69`) |
|
|
368
|
-
| **顺序 BFS + 指针游标** | 依赖队列用索引指针替代 `shift()`,避免数组塌缩开销(`src/core/deps.ts:74`) |
|
|
369
|
-
| **已解析集合去重** | `resolved` 用 `Set<string>` 去重,避免重复解析相同依赖(`src/core/deps.ts:73`) |
|
|
370
|
-
| **批量头尾双扫** | `batchFindInRepo()` 利用排序 idx 从首尾同时二分查找,适合升级候选收集(`src/repo/repository.ts`) |
|
|
371
|
-
| **keep-alive HTTP** | 共享 `https.Agent({ keepAlive: true, maxSockets: 8 })`,复用 TCP/TLS 连接(`src/repo/repository.ts:22`) |
|
|
372
|
-
| **异步解压 .gz** | `decompressAsync()` 用 `zlib.gunzip()` 回调版,不阻塞事件循环(`src/core/compress.ts:9`) |
|
|
373
|
-
| **304 条件请求** | 同步时发 `If-Modified-Since`,服务端返回 304 直接跳过(`src/repo/repository.ts:96`) |
|
|
374
|
-
|
|
375
|
-
#### 删除时的依赖处理(`src/ops/remove.ts`)
|
|
376
|
-
|
|
377
|
-
| 操作 | 逻辑 |
|
|
378
|
-
|------|------|
|
|
379
|
-
| `-R` | 仅删除指定包,不处理依赖 |
|
|
380
|
-
| `-Rs` | 删除包 + 递归查找孤儿(不被其他包 RequiredBy 的包),按逆拓扑序删除 |
|
|
381
|
-
| `-Rc` | 级联:找出所有"需要"目标包的包,一并删除 |
|
|
382
|
-
| `-Rsc` | 递归 + 级联组合 |
|
|
383
|
-
| `-Rn` | 备份 `/var/lib/dpkg/info/<pkg>.conffiles` 中的配置文件为 `.dpkg-old`,再删除 |
|
|
384
|
-
|
|
385
|
-
删除时自动排序:被依赖者先删(叶子节点先于根节点),确保依赖检查不报错。
|
|
386
|
-
`isRequiredByOthers()` 遍历所有已安装包的 `Depends` 字段,判断目标包是否被需要。
|
|
387
|
-
|
|
388
|
-
### makepkg(`src/makepkg/`)
|
|
389
|
-
|
|
390
|
-
独立的 `makepkg` 实现,无需 `base-devel` 或任何 Arch 工具即可从 PKGBUILD
|
|
391
|
-
构建 Arch Linux 包。
|
|
63
|
+
## 快速上手
|
|
392
64
|
|
|
393
65
|
```bash
|
|
394
|
-
#
|
|
395
|
-
|
|
396
|
-
makepkg --syncdeps --install
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
功能:
|
|
66
|
+
# 搜索
|
|
67
|
+
pacman -Ss neofetch
|
|
400
68
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
`sha256sums` 等)
|
|
404
|
-
- 下载并验证源文件(支持 http/https URL,带校验和验证)
|
|
405
|
-
- 解压归档:`.tar.gz`、`.tar.xz`、`.tar.bz2`、`.tar.zst`、`.zip`
|
|
406
|
-
- 在干净的环境中运行 `prepare()`、`build()`、`check()` 和 `package()` 函数
|
|
407
|
-
- 创建带有有效 `.PKGINFO` 元数据的 `.pkg.tar.zst` 归档
|
|
408
|
-
- 通过 `--syncdeps` 进行依赖解析 — 通过 pacman-debian 的同步数据库
|
|
409
|
-
(Debian 和 Arch 仓库)安装缺失依赖
|
|
410
|
-
- 支持 `--install`(`-i`)、`--clean`(`-c`)、`--rmdeps`
|
|
411
|
-
|
|
412
|
-
| 参数 | 说明 |
|
|
413
|
-
|------|------|
|
|
414
|
-
| `-s, --syncdeps` | 通过 pacman 安装缺失依赖 |
|
|
415
|
-
| `-i, --install` | 安装构建好的包 |
|
|
416
|
-
| `-c, --clean` | 打包后清理构建文件 |
|
|
417
|
-
| `-r, --rmdeps` | 构建后删除已安装的依赖 |
|
|
418
|
-
| `-f, --force` | 覆盖已有的包文件 |
|
|
419
|
-
| `-o, --nobuild` | 仅下载和解压源码(不构建) |
|
|
420
|
-
| `--nocolor` | 禁用彩色输出 |
|
|
421
|
-
| `--printsrcinfo` | 打印 `.SRCINFO` 并退出 |
|
|
422
|
-
|
|
423
|
-
### 命令
|
|
424
|
-
|
|
425
|
-
#### 同步(-S)
|
|
426
|
-
|
|
427
|
-
| 命令 | 说明 |
|
|
428
|
-
|------|------|
|
|
429
|
-
| `pacman -S <pkg>` | 从仓库安装包 |
|
|
430
|
-
| `pacman -Sy` | 刷新包数据库(mtime 检查,24 小时) |
|
|
431
|
-
| `pacman -Syy` | 强制刷新包数据库(清除内存 idx 缓存) |
|
|
432
|
-
| `pacman -Su` | 升级所有已安装的包 |
|
|
433
|
-
| `pacman -Syu` | 刷新数据库并升级 |
|
|
434
|
-
| `pacman -Ss <keyword>` | 搜索仓库 |
|
|
435
|
-
| `pacman -Si <pkg>` | 显示远程包信息 |
|
|
436
|
-
| `pacman -Sl` | 列出仓库中所有包 |
|
|
437
|
-
| `pacman -Sw <pkg>` | 真正下载 .deb/.pkg.tar.zst 到缓存目录,不安装 |
|
|
438
|
-
| `pacman -Sc` | 删除缓存目录中的 .deb/.pkg.tar.zst 文件,保留仓库元数据 |
|
|
439
|
-
| `pacman -Scc` | 清空整个缓存目录(含仓库 jsonl/idx,需重新 -Sy) |
|
|
440
|
-
| `pacman -Sp <pkg>` | 打印实际下载 URL(不会安装) |
|
|
441
|
-
|
|
442
|
-
#### 删除(-R)
|
|
443
|
-
|
|
444
|
-
| 命令 | 说明 |
|
|
445
|
-
|------|------|
|
|
446
|
-
| `pacman -R <pkg>` | 删除包 |
|
|
447
|
-
| `pacman -Rs <pkg>` | 删除包及未使用的依赖 |
|
|
448
|
-
| `pacman -Rn <pkg>` | 删除包及其配置文件 |
|
|
449
|
-
| `pacman -Rns <pkg>` | 删除包、依赖和配置文件 |
|
|
450
|
-
| `pacman -Rc <pkg>` | 级联删除:删除依赖该包的所有包 |
|
|
451
|
-
| `pacman -Rdd <pkg>` | 跳过依赖检查强制删除 |
|
|
452
|
-
| `pacman -Rp <pkg>` | 打印将要删除的内容(干运行) |
|
|
453
|
-
|
|
454
|
-
支持多目标(`pacman -R a b`):所有目标合并显示后统一确认。
|
|
455
|
-
|
|
456
|
-
#### 查询(-Q)
|
|
457
|
-
|
|
458
|
-
| 命令 | 说明 |
|
|
459
|
-
|------|------|
|
|
460
|
-
| `pacman -Q` | 列出所有已安装的包 |
|
|
461
|
-
| `pacman -Qe` | 列出显式安装的包 |
|
|
462
|
-
| `pacman -Qd` | 列出作为依赖安装的包 |
|
|
463
|
-
| `pacman -Qdt` | 列出孤儿包(未使用的依赖) |
|
|
464
|
-
| `pacman -Qi <pkg>` | 显示详细包信息 |
|
|
465
|
-
| `pacman -Ql <pkg>` | 列出包拥有的文件 |
|
|
466
|
-
| `pacman -Qo <file>` | 查询文件属于哪个包 |
|
|
467
|
-
| `pacman -Qs <keyword>` | 搜索已安装的包 |
|
|
468
|
-
| `pacman -Qk [pkg]` | 验证已安装包的文件完整性(检查文件是否存在且非空) |
|
|
469
|
-
|
|
470
|
-
#### 其他
|
|
471
|
-
|
|
472
|
-
| 命令 | 说明 |
|
|
473
|
-
|------|------|
|
|
474
|
-
| `pacman -U <file>` | 安装本地包文件(.deb/.pkg.tar.zst) |
|
|
475
|
-
| `pacman -D --asdeps <pkg>` | 将包标记为依赖 |
|
|
476
|
-
| `pacman -D --asexplicit <pkg>` | 将包标记为显式安装 |
|
|
477
|
-
| `pacman -T <pkg>` | 检查依赖是否满足 |
|
|
478
|
-
| `pacman -F <file>` | 搜索提供该文件的包 |
|
|
479
|
-
| `pacman -V` | 显示版本号 |
|
|
480
|
-
|
|
481
|
-
#### 内置工具
|
|
482
|
-
|
|
483
|
-
| 命令 | 说明 |
|
|
484
|
-
|------|------|
|
|
485
|
-
| `pacman-conf` | 打印解析后的配置(类似 Arch 的 `pacman-conf`)。查看每个仓库的 Server URL、Type、Dist、Components。 |
|
|
486
|
-
| `makepkg` | 从 PKGBUILD 文件构建 Arch Linux 包。支持 `--syncdeps`、`--install`、`--clean`、源码下载和 `.pkg.tar.zst` 创建。 |
|
|
487
|
-
| `pacman-debian-setup` | 交互式安装:创建配置、Include 文件、符号链接(`/etc/pacman.conf`、`/usr/local/bin/pacman`)和虚拟 `pacman` dpkg 条目。 |
|
|
488
|
-
| `paclink` | 管理持久化的 Debian→Arch 虚拟包名映射。链接存储在本地数据库中,仅对 pacman/libalpm 可见,dpkg 不可见。 |
|
|
489
|
-
| `update-ca-trust` | Arch 兼容 CA 证书更新器(包装 Debian 的 `update-ca-certificates`) |
|
|
490
|
-
| `archlinux-java` | Java 环境管理器:`status`、`get`、`set`、`unset`、`fix`(包装 `update-alternatives`) |
|
|
491
|
-
| `fix_default` | 打印当前默认 JDK 短名(Arch Java 包安装脚本内部使用) |
|
|
492
|
-
|
|
493
|
-
#### paclink(链接管理)
|
|
494
|
-
|
|
495
|
-
| 命令 | 说明 |
|
|
496
|
-
|------|------|
|
|
497
|
-
| `paclink -Ln <deb> <virt>` | 创建链接:Debian 包 `<deb>` 提供 Arch 虚拟名 `<virt>` |
|
|
498
|
-
| `paclink -L` | 列出所有链接 |
|
|
499
|
-
| `paclink -Ls <关键词>` | 搜索链接 |
|
|
500
|
-
| `paclink -Li <虚拟名>` | 显示链接详情 |
|
|
501
|
-
| `paclink -R <虚拟名>` | 删除链接(不影响 Debian 包) |
|
|
502
|
-
|
|
503
|
-
示例:
|
|
504
|
-
|
|
505
|
-
```bash
|
|
506
|
-
# 映射 dash 提供 sh
|
|
507
|
-
sudo paclink -Ln dash sh
|
|
69
|
+
# 安装
|
|
70
|
+
sudo pacman -S neofetch
|
|
508
71
|
|
|
509
|
-
#
|
|
510
|
-
sudo
|
|
72
|
+
# 删除
|
|
73
|
+
sudo pacman -R neofetch
|
|
511
74
|
|
|
512
|
-
#
|
|
513
|
-
|
|
75
|
+
# 升级所有
|
|
76
|
+
sudo pacman -Syu
|
|
514
77
|
|
|
515
|
-
#
|
|
516
|
-
|
|
78
|
+
# 查询已安装
|
|
79
|
+
pacman -Q
|
|
517
80
|
```
|
|
518
81
|
|
|
519
|
-
|
|
520
|
-
真包优先,安装时自动移除链接。
|
|
521
|
-
|
|
522
|
-
#### 全局参数
|
|
82
|
+
完整命令参考见[使用文档](docs/zh-CN/usage.md)。
|
|
523
83
|
|
|
524
|
-
|
|
525
|
-
|------|------|
|
|
526
|
-
| `--noconfirm` | 跳过确认提示 |
|
|
527
|
-
| `--confirm` | 始终询问确认(默认) |
|
|
528
|
-
| `--needed` | 不重新安装已是最新的包 |
|
|
529
|
-
| `--noscriptlet` | 不执行安装脚本 |
|
|
530
|
-
| `--print` | 干运行:显示将要执行的操作但不实际执行 |
|
|
531
|
-
|
|
532
|
-
### yay / AUR 支持
|
|
533
|
-
|
|
534
|
-
通过内置 libalpm,`yay` 可与 `pacman-debian` 配合使用:
|
|
535
|
-
|
|
536
|
-
```bash
|
|
537
|
-
# 安装 yay(需要 Go)
|
|
538
|
-
sudo apt install golang-go
|
|
539
|
-
git clone https://aur.archlinux.org/yay.git /tmp/yay
|
|
540
|
-
cd /tmp/yay && go build -o /usr/local/bin/yay
|
|
541
|
-
|
|
542
|
-
# 与 pacman-debian 配合使用(PACMAN 环境变量自动识别)
|
|
543
|
-
yay -Ss ponysay
|
|
544
|
-
sudo -E yay -S ponysay
|
|
545
|
-
```
|
|
84
|
+
## 文档
|
|
546
85
|
|
|
547
|
-
|
|
548
|
-
|
|
86
|
+
| 主题 | 中文 | English |
|
|
87
|
+
|------|------|---------|
|
|
88
|
+
| 使用(完整命令参考) | [docs/zh-CN/usage.md](docs/zh-CN/usage.md) | [docs/en/usage.md](docs/en/usage.md) |
|
|
89
|
+
| 配置 | [docs/zh-CN/configuration.md](docs/zh-CN/configuration.md) | [docs/en/configuration.md](docs/en/configuration.md) |
|
|
90
|
+
| 架构与数据库 | [docs/zh-CN/architecture.md](docs/zh-CN/architecture.md) | [docs/en/architecture.md](docs/en/architecture.md) |
|
|
91
|
+
| makepkg | [docs/zh-CN/makepkg.md](docs/zh-CN/makepkg.md) | [docs/en/makepkg.md](docs/en/makepkg.md) |
|
|
92
|
+
| libalpm & yay/AUR | [docs/zh-CN/yay-aur.md](docs/zh-CN/yay-aur.md) | [docs/en/yay-aur.md](docs/en/yay-aur.md) |
|
|
93
|
+
| paclink(包链接) | [docs/zh-CN/paclink.md](docs/zh-CN/paclink.md) | [docs/en/paclink.md](docs/en/paclink.md) |
|
|
94
|
+
| 安装说明(详细) | [docs/zh-CN/installation.md](docs/zh-CN/installation.md) | [docs/en/installation.md](docs/en/installation.md) |
|
|
549
95
|
|
|
550
96
|
## 许可证
|
|
551
97
|
|
package/dist/ar.d.ts
ADDED
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function decompress(data: Buffer, filename: string): Buffer;
|
|
2
|
+
export declare function decompressAsync(data: Buffer, filename: string): Promise<Buffer>;
|
|
3
|
+
export declare function decompressStream(stream: NodeJS.ReadableStream, ext: string): Promise<Buffer>;
|
|
4
|
+
//# sourceMappingURL=compress.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RepoPkg } from './types';
|
|
2
|
+
export interface Dep {
|
|
3
|
+
name: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
operator?: string;
|
|
6
|
+
arch?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface DepResult {
|
|
9
|
+
pkg: RepoPkg;
|
|
10
|
+
needed: boolean;
|
|
11
|
+
reason: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function parseDep(s: string): Dep[];
|
|
14
|
+
export interface ResolveDepsOptions {
|
|
15
|
+
upgradeMode?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveDeps(targets: string[], opts?: ResolveDepsOptions): {
|
|
18
|
+
install: DepResult[];
|
|
19
|
+
errors: string[];
|
|
20
|
+
};
|
|
21
|
+
export declare function invalidateDepCache(): void;
|
|
22
|
+
export interface Conflict {
|
|
23
|
+
a: string;
|
|
24
|
+
b: string;
|
|
25
|
+
reason: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function detectConflicts(packages: RepoPkg[]): Conflict[];
|
|
28
|
+
//# sourceMappingURL=deps.d.ts.map
|