pacman-debian 7.2.0

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.
Files changed (233) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +440 -0
  3. package/README.zh.md +388 -0
  4. package/README_zh-CN.md +421 -0
  5. package/dist/ar.d.ts +8 -0
  6. package/dist/ar.d.ts.map +1 -0
  7. package/dist/ar.js +88 -0
  8. package/dist/ar.js.map +1 -0
  9. package/dist/cli/pacman.d.ts +2 -0
  10. package/dist/cli/pacman.d.ts.map +1 -0
  11. package/dist/cli/pacman.js +512 -0
  12. package/dist/cli/pacman.js.map +1 -0
  13. package/dist/compress.d.ts +2 -0
  14. package/dist/compress.d.ts.map +1 -0
  15. package/dist/compress.js +78 -0
  16. package/dist/compress.js.map +1 -0
  17. package/dist/config.d.ts +3 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +90 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/control.d.ts +2 -0
  22. package/dist/control.d.ts.map +1 -0
  23. package/dist/control.js +31 -0
  24. package/dist/control.js.map +1 -0
  25. package/dist/core/ar.d.ts +7 -0
  26. package/dist/core/ar.d.ts.map +1 -0
  27. package/dist/core/ar.js +45 -0
  28. package/dist/core/ar.js.map +1 -0
  29. package/dist/core/compress.d.ts +2 -0
  30. package/dist/core/compress.d.ts.map +1 -0
  31. package/dist/core/compress.js +75 -0
  32. package/dist/core/compress.js.map +1 -0
  33. package/dist/core/control.d.ts +2 -0
  34. package/dist/core/control.d.ts.map +1 -0
  35. package/dist/core/control.js +29 -0
  36. package/dist/core/control.js.map +1 -0
  37. package/dist/core/deb.d.ts +4 -0
  38. package/dist/core/deb.d.ts.map +1 -0
  39. package/dist/core/deb.js +89 -0
  40. package/dist/core/deb.js.map +1 -0
  41. package/dist/core/deps.d.ts +25 -0
  42. package/dist/core/deps.d.ts.map +1 -0
  43. package/dist/core/deps.js +230 -0
  44. package/dist/core/deps.js.map +1 -0
  45. package/dist/core/options.d.ts +19 -0
  46. package/dist/core/options.d.ts.map +1 -0
  47. package/dist/core/options.js +3 -0
  48. package/dist/core/options.js.map +1 -0
  49. package/dist/core/pkgfile.d.ts +35 -0
  50. package/dist/core/pkgfile.d.ts.map +1 -0
  51. package/dist/core/pkgfile.js +162 -0
  52. package/dist/core/pkgfile.js.map +1 -0
  53. package/dist/core/tar.d.ts +13 -0
  54. package/dist/core/tar.d.ts.map +1 -0
  55. package/dist/core/tar.js +132 -0
  56. package/dist/core/tar.js.map +1 -0
  57. package/dist/core/types.d.ts +83 -0
  58. package/dist/core/types.d.ts.map +1 -0
  59. package/dist/core/types.js +3 -0
  60. package/dist/core/types.js.map +1 -0
  61. package/dist/database.d.ts +20 -0
  62. package/dist/database.d.ts.map +1 -0
  63. package/dist/database.js +181 -0
  64. package/dist/database.js.map +1 -0
  65. package/dist/db/database.d.ts +17 -0
  66. package/dist/db/database.d.ts.map +1 -0
  67. package/dist/db/database.js +145 -0
  68. package/dist/db/database.js.map +1 -0
  69. package/dist/db/dpkg-compat.d.ts +19 -0
  70. package/dist/db/dpkg-compat.d.ts.map +1 -0
  71. package/dist/db/dpkg-compat.js +150 -0
  72. package/dist/db/dpkg-compat.js.map +1 -0
  73. package/dist/db/localdb.d.ts +9 -0
  74. package/dist/db/localdb.d.ts.map +1 -0
  75. package/dist/db/localdb.js +246 -0
  76. package/dist/db/localdb.js.map +1 -0
  77. package/dist/db/sqlite.d.ts +20 -0
  78. package/dist/db/sqlite.d.ts.map +1 -0
  79. package/dist/db/sqlite.js +309 -0
  80. package/dist/db/sqlite.js.map +1 -0
  81. package/dist/deb.d.ts +5 -0
  82. package/dist/deb.d.ts.map +1 -0
  83. package/dist/deb.js +105 -0
  84. package/dist/deb.js.map +1 -0
  85. package/dist/dpkg-compat.d.ts +18 -0
  86. package/dist/dpkg-compat.d.ts.map +1 -0
  87. package/dist/dpkg-compat.js +137 -0
  88. package/dist/dpkg-compat.js.map +1 -0
  89. package/dist/i18n/en.json +109 -0
  90. package/dist/i18n/index.d.ts +3 -0
  91. package/dist/i18n/index.d.ts.map +1 -0
  92. package/dist/i18n/index.js +36 -0
  93. package/dist/i18n/index.js.map +1 -0
  94. package/dist/i18n/zh-CN.json +109 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +9 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/install.d.ts +2 -0
  100. package/dist/install.d.ts.map +1 -0
  101. package/dist/install.js +126 -0
  102. package/dist/install.js.map +1 -0
  103. package/dist/makepkg/build.d.ts +19 -0
  104. package/dist/makepkg/build.d.ts.map +1 -0
  105. package/dist/makepkg/build.js +370 -0
  106. package/dist/makepkg/build.js.map +1 -0
  107. package/dist/makepkg/index.d.ts +3 -0
  108. package/dist/makepkg/index.d.ts.map +1 -0
  109. package/dist/makepkg/index.js +84 -0
  110. package/dist/makepkg/index.js.map +1 -0
  111. package/dist/makepkg/pkgbuild.d.ts +36 -0
  112. package/dist/makepkg/pkgbuild.d.ts.map +1 -0
  113. package/dist/makepkg/pkgbuild.js +165 -0
  114. package/dist/makepkg/pkgbuild.js.map +1 -0
  115. package/dist/ops/install.d.ts +5 -0
  116. package/dist/ops/install.d.ts.map +1 -0
  117. package/dist/ops/install.js +299 -0
  118. package/dist/ops/install.js.map +1 -0
  119. package/dist/ops/query.d.ts +9 -0
  120. package/dist/ops/query.d.ts.map +1 -0
  121. package/dist/ops/query.js +189 -0
  122. package/dist/ops/query.js.map +1 -0
  123. package/dist/ops/remove.d.ts +3 -0
  124. package/dist/ops/remove.d.ts.map +1 -0
  125. package/dist/ops/remove.js +121 -0
  126. package/dist/ops/remove.js.map +1 -0
  127. package/dist/ops/upgrade.d.ts +4 -0
  128. package/dist/ops/upgrade.d.ts.map +1 -0
  129. package/dist/ops/upgrade.js +122 -0
  130. package/dist/ops/upgrade.js.map +1 -0
  131. package/dist/pacman.d.ts +2 -0
  132. package/dist/pacman.d.ts.map +1 -0
  133. package/dist/pacman.js +165 -0
  134. package/dist/pacman.js.map +1 -0
  135. package/dist/query.d.ts +5 -0
  136. package/dist/query.d.ts.map +1 -0
  137. package/dist/query.js +143 -0
  138. package/dist/query.js.map +1 -0
  139. package/dist/remove.d.ts +2 -0
  140. package/dist/remove.d.ts.map +1 -0
  141. package/dist/remove.js +82 -0
  142. package/dist/remove.js.map +1 -0
  143. package/dist/repo/config.d.ts +3 -0
  144. package/dist/repo/config.d.ts.map +1 -0
  145. package/dist/repo/config.js +146 -0
  146. package/dist/repo/config.js.map +1 -0
  147. package/dist/repo/repository.d.ts +10 -0
  148. package/dist/repo/repository.d.ts.map +1 -0
  149. package/dist/repo/repository.js +596 -0
  150. package/dist/repo/repository.js.map +1 -0
  151. package/dist/repository.d.ts +10 -0
  152. package/dist/repository.d.ts.map +1 -0
  153. package/dist/repository.js +175 -0
  154. package/dist/repository.js.map +1 -0
  155. package/dist/scripts/pacman-conf.d.ts +3 -0
  156. package/dist/scripts/pacman-conf.d.ts.map +1 -0
  157. package/dist/scripts/pacman-conf.js +74 -0
  158. package/dist/scripts/pacman-conf.js.map +1 -0
  159. package/dist/scripts/setup.d.ts +3 -0
  160. package/dist/scripts/setup.d.ts.map +1 -0
  161. package/dist/scripts/setup.js +289 -0
  162. package/dist/scripts/setup.js.map +1 -0
  163. package/dist/tar.d.ts +17 -0
  164. package/dist/tar.d.ts.map +1 -0
  165. package/dist/tar.js +148 -0
  166. package/dist/tar.js.map +1 -0
  167. package/dist/types.d.ts +80 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +3 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/ui/colors.d.ts +13 -0
  172. package/dist/ui/colors.d.ts.map +1 -0
  173. package/dist/ui/colors.js +38 -0
  174. package/dist/ui/colors.js.map +1 -0
  175. package/dist/ui/format.d.ts +3 -0
  176. package/dist/ui/format.d.ts.map +1 -0
  177. package/dist/ui/format.js +15 -0
  178. package/dist/ui/format.js.map +1 -0
  179. package/dist/ui/progress.d.ts +8 -0
  180. package/dist/ui/progress.d.ts.map +1 -0
  181. package/dist/ui/progress.js +50 -0
  182. package/dist/ui/progress.js.map +1 -0
  183. package/dist/ui/prompt.d.ts +4 -0
  184. package/dist/ui/prompt.d.ts.map +1 -0
  185. package/dist/ui/prompt.js +60 -0
  186. package/dist/ui/prompt.js.map +1 -0
  187. package/lib/pac4deb/Makefile +26 -0
  188. package/lib/pac4deb/README.md +47 -0
  189. package/lib/pac4deb/include/alpm.h +166 -0
  190. package/lib/pac4deb/include/alpm_list.h +42 -0
  191. package/lib/pac4deb/libalpm.so +0 -0
  192. package/lib/pac4deb/src/alpm_list.c +102 -0
  193. package/lib/pac4deb/src/genstubs.sh +51 -0
  194. package/lib/pac4deb/src/genstubs2.sh +72 -0
  195. package/lib/pac4deb/src/genstubs3.sh +43 -0
  196. package/lib/pac4deb/src/libalpm.c +537 -0
  197. package/lib/pac4deb/src/stubs_manual.c +198 -0
  198. package/lib/pac4deb/stubs.c +6 -0
  199. package/lib/pac4deb/update_header.sh +15 -0
  200. package/package.json +41 -0
  201. package/src/cli/pacman.ts +308 -0
  202. package/src/core/ar.ts +54 -0
  203. package/src/core/compress.ts +27 -0
  204. package/src/core/control.ts +22 -0
  205. package/src/core/deb.ts +47 -0
  206. package/src/core/deps.ts +260 -0
  207. package/src/core/options.ts +20 -0
  208. package/src/core/pkgfile.ts +146 -0
  209. package/src/core/tar.ts +101 -0
  210. package/src/core/types.ts +89 -0
  211. package/src/db/database.ts +102 -0
  212. package/src/db/dpkg-compat.ts +129 -0
  213. package/src/db/localdb.ts +181 -0
  214. package/src/i18n/en.json +114 -0
  215. package/src/i18n/index.ts +32 -0
  216. package/src/i18n/zh-CN.json +114 -0
  217. package/src/index.ts +7 -0
  218. package/src/makepkg/build.ts +351 -0
  219. package/src/makepkg/index.ts +87 -0
  220. package/src/makepkg/pkgbuild.ts +146 -0
  221. package/src/ops/install.ts +260 -0
  222. package/src/ops/query.ts +117 -0
  223. package/src/ops/remove.ts +77 -0
  224. package/src/ops/upgrade.ts +87 -0
  225. package/src/repo/config.ts +96 -0
  226. package/src/repo/repository.ts +520 -0
  227. package/src/scripts/pacman-conf.ts +68 -0
  228. package/src/scripts/setup.ts +261 -0
  229. package/src/ui/colors.ts +40 -0
  230. package/src/ui/format.ts +9 -0
  231. package/src/ui/progress.ts +26 -0
  232. package/src/ui/prompt.ts +21 -0
  233. package/tsconfig.json +19 -0
@@ -0,0 +1,421 @@
1
+ # pacman-debian
2
+
3
+ 一个采用 Arch Linux pacman 命令行语法的包管理器,直接操作 Debian/Ubuntu `.deb`
4
+ 包。它在 dpkg 层面管理包(绕过 APT),同时也支持原生 Arch Linux `.pkg.tar.zst`
5
+ 包(通过内置 libalpm 兼容 yay 实现 AUR 支持)。
6
+
7
+ ## 目标
8
+
9
+ - 在基于 Debian 的系统上提供一致的 pacman 风格 CLI,消除 `apt`、`dpkg` 及
10
+ 各种前端之间的切换成本。
11
+ - 在单一工具下支持多仓库混合配置(Debian/Ubuntu + Arch Linux 仓库)。
12
+ - 与 dpkg 数据库(`/var/lib/dpkg/status`)完全兼容,可与 APT 及其他 dpkg
13
+ 前端共存。
14
+ - 提供 libalpm ABI 兼容的共享库,使基于 Go 的 AUR 助手(yay)无需修改即可
15
+ 在 Debian 上运行。
16
+
17
+ ## 环境要求
18
+
19
+ - Node.js 18+(TypeScript,通过 `tsc` 编译)
20
+ - pnpm 包管理器
21
+ - Debian 12 Bookworm(或兼容的 Debian 发行版)
22
+ - 安装、删除和升级操作需要 root 权限
23
+ - 编译工具:`gcc`、`make`、`ldconfig`
24
+
25
+ ## 快速开始
26
+
27
+ ```bash
28
+ # 编译 TypeScript + C 库
29
+ pnpm install && pnpm build
30
+
31
+ # 运行交互式安装(创建配置、符号链接、dpkg 条目)
32
+ sudo node dist/scripts/setup.js
33
+
34
+ # 或手动设置:
35
+ sudo ln -sf "$PWD/dist/cli/pacman.js" /usr/local/bin/pacman
36
+
37
+ # 同步仓库
38
+ sudo pacman -Sy
39
+
40
+ # 搜索包
41
+ pacman -Ss neofetch
42
+
43
+ # 安装
44
+ sudo pacman -S neofetch
45
+
46
+ # 升级所有包
47
+ sudo pacman -Syu
48
+
49
+ # 删除
50
+ sudo pacman -R neofetch
51
+ ```
52
+
53
+ ## 配置
54
+
55
+ 配置文件:`/etc/pacman-debian/pacman.conf`
56
+
57
+ 配置使用纯 Arch Linux pacman 语法,支持 `Include` 指令。仓库特有键
58
+ (`Type`、`Dist`、`Components` 等)放在 `/etc/pacman.d/` 的包含文件中。
59
+
60
+ 配置示例:
61
+
62
+ ```ini
63
+ [options]
64
+ Architecture = auto
65
+
66
+ [bookworm]
67
+ Include = /etc/pacman.d/debian-bookworm
68
+
69
+ [extra]
70
+ Include = /etc/pacman.d/arch-extra
71
+ ```
72
+
73
+ 包含文件示例(`/etc/pacman.d/debian-bookworm`):
74
+
75
+ ```
76
+ Server = https://mirrors.tuna.tsinghua.edu.cn/debian
77
+ Type = debian
78
+ Dist = bookworm
79
+ Components = main contrib non-free non-free-firmware
80
+ ```
81
+
82
+ Arch 仓库的包含文件(`/etc/pacman.d/arch-extra`):
83
+
84
+ ```
85
+ Server = http://mirror.archlinuxarm.org/$arch/$repo
86
+ Type = arch
87
+ Architecture = auto
88
+ ```
89
+
90
+ 安装时会创建 `/etc/pacman.conf` → `/etc/pacman-debian/pacman.conf` 符号链接,
91
+ 以便硬编码该路径的工具(如 yay)正常工作。
92
+
93
+ 使用 `pacman-conf` 查看解析后的配置(所有 `Include` 文件已展开,
94
+ `$repo`/`$arch` 变量已替换):
95
+
96
+ ```bash
97
+ $ pacman-conf
98
+ # pacman-debian configuration
99
+ [options]
100
+ Architecture = auto
101
+
102
+ [bookworm]
103
+ Server = https://mirrors.tuna.tsinghua.edu.cn/debian
104
+ Type = debian
105
+ Dist = bookworm
106
+ Components = main contrib non-free non-free-firmware
107
+
108
+ [extra]
109
+ Server = http://mirror.archlinuxarm.org/$arch/$repo
110
+ Type = arch
111
+ Architecture = auto
112
+ ```
113
+
114
+ ## 数据库
115
+
116
+ ### 本地数据库:`/var/lib/pacman-debian/local/`
117
+
118
+ 采用与 Arch Linux 本地 DB 一致的目录-包格式:
119
+
120
+ ```
121
+ /var/lib/pacman-debian/local/
122
+ ├── by-name/
123
+ │ ├── fastfetch -> ../fastfetch-2.64.2-2/
124
+ │ └── ...
125
+ ├── fastfetch-2.64.2-2/
126
+ │ ├── desc # JSON 元数据(名称、版本、依赖、大小等)
127
+ │ └── files # 文件清单
128
+ └── ...
129
+ ```
130
+
131
+ ### dpkg 兼容
132
+
133
+ 通过 `dpkg` 或 `apt` 安装的包在查询时直接从 `/var/lib/dpkg/status` 读取
134
+ (按 mtime 缓存)。`pacman-debian` 安装包时会同时写入 dpkg 兼容的条目,
135
+ 确保 `apt` 和 `dpkg` 仍能识别该包。
136
+
137
+ ### 仓库缓存:`/var/cache/pacman-debian/packages/`
138
+
139
+ 每个仓库以 JSON Lines 块形式缓存(每个 `.jsonl` 文件 5000 个包)。
140
+ 同步时还会生成全局排序的 `packages.idx` 索引,格式:
141
+ `包名 描述\tprovides\t分块文件\t字节偏移`
142
+
143
+ ```
144
+ /var/cache/pacman-debian/packages/
145
+ ├── bookworm/
146
+ │ ├── 00000.jsonl # JSON Lines, ~5000 包/块
147
+ │ ├── ...
148
+ │ └── packages.idx # 全局排序索引 (~200KB)
149
+ └── ...
150
+ ```
151
+
152
+ **查找路径:**
153
+
154
+ | 操作 | 方法 | 原因 |
155
+ |------|------|------|
156
+ | `-S <pkg>` / `-Qo` | 二分搜索 `packages.idx` → seek JSONL | O(log N),只读一行 |
157
+ | `-Ss` | 逐行扫 `packages.idx`(包名+描述)→ seek JSONL | ~1.4MB 扫描,不解析 JSON |
158
+ | `-Sl` | 扫 `packages.idx` → seek 每个包 | 全量懒加载 |
159
+ | 依赖 provides | 扫 `packages.idx` provides 字段 | 纯索引,不读 JSONL |
160
+ | `-Qi` / `-Ql` | dpkg 状态或本地数据库 | 不涉及缓存 |
161
+
162
+ ## 仓库支持
163
+
164
+ - **Debian/Ubuntu**:从标准仓库索引读取 `Packages.gz` / `Packages.xz`。
165
+ 支持 `Server` URL 中的 `$repo`/`$arch` 变量替换。
166
+ - **Arch Linux**:从 Arch 兼容仓库读取 `db.tar.gz`。下载的 `.pkg.tar.zst`
167
+ 文件会被解包并安装。
168
+ - **Arch ARM**:二进制包需要 glibc 2.38+ — Debian 12 自带 glibc 2.36,
169
+ 因此在 Bookworm 上 Arch ARM 二进制仓库**无法使用**(升级 glibc 会损坏系统)。
170
+ 请改用 `makepkg` 进行本地编译。
171
+
172
+ ## libalpm(libpac4deb)
173
+
174
+ 位于 `lib/pac4deb/` 的 C 库,实现了 libalpm ABI(`alpm.h`),使基于 Go 的
175
+ AUR 助手(如 yay)无需修改即可在 Debian 上运行。它读取:
176
+
177
+ - 本地数据库(`/var/lib/pacman-debian/local/`)— pacman-debian 安装的包
178
+ - dpkg 状态(`/var/lib/dpkg/status`)— apt/dpkg 的系统包
179
+ - 同步数据库(`/var/cache/pacman-debian/packages/*/` — JSONL 块)
180
+
181
+ 提供了 200+ 个不常用函数的桩实现。
182
+
183
+ ## makepkg(`src/makepkg/`)
184
+
185
+ 独立的 `makepkg` 实现,无需 `base-devel` 或任何 Arch 工具即可从 PKGBUILD
186
+ 构建 Arch Linux 包。
187
+
188
+ ```bash
189
+ # 从 PKGBUILD 构建包
190
+ cd /path/to/PKGBUILD/dir
191
+ makepkg --syncdeps --install
192
+ ```
193
+
194
+ 功能:
195
+
196
+ - 通过 bash sourcing(`source PKGBUILD`)解析 PKGBUILD — 支持所有标准变量
197
+ (`pkgname`、`pkgver`、`source`、`depends`、`makedepends`、
198
+ `sha256sums` 等)
199
+ - 下载并验证源文件(支持 http/https URL,带校验和验证)
200
+ - 解压归档:`.tar.gz`、`.tar.xz`、`.tar.bz2`、`.tar.zst`、`.zip`
201
+ - 在干净的环境中运行 `prepare()`、`build()`、`check()` 和 `package()` 函数
202
+ - 创建带有有效 `.PKGINFO` 元数据的 `.pkg.tar.zst` 归档
203
+ - 通过 `--syncdeps` 进行依赖解析 — 通过 pacman-debian 的同步数据库
204
+ (Debian 和 Arch 仓库)安装缺失依赖
205
+ - 支持 `--install`(`-i`)、`--clean`(`-c`)、`--rmdeps`
206
+
207
+ | 参数 | 说明 |
208
+ |------|------|
209
+ | `-s, --syncdeps` | 通过 pacman 安装缺失依赖 |
210
+ | `-i, --install` | 安装构建好的包 |
211
+ | `-c, --clean` | 打包后清理构建文件 |
212
+ | `-r, --rmdeps` | 构建后删除已安装的依赖 |
213
+ | `-f, --force` | 覆盖已有的包文件 |
214
+ | `-o, --nobuild` | 仅下载和解压源码(不构建) |
215
+ | `--nocolor` | 禁用彩色输出 |
216
+ | `--printsrcinfo` | 打印 `.SRCINFO` 并退出 |
217
+
218
+ ## 命令
219
+
220
+ ### 同步(-S)
221
+
222
+ | 命令 | 说明 |
223
+ |------|------|
224
+ | `pacman -S <pkg>` | 从仓库安装包 |
225
+ | `pacman -Sy` | 刷新包数据库(mtime 检查,24 小时) |
226
+ | `pacman -Syy` | 强制刷新包数据库 |
227
+ | `pacman -Su` | 升级所有已安装的包 |
228
+ | `pacman -Syu` | 刷新数据库并升级 |
229
+ | `pacman -Ss <keyword>` | 搜索仓库 |
230
+ | `pacman -Si <pkg>` | 显示远程包信息 |
231
+ | `pacman -Sl` | 列出仓库中所有包 |
232
+ | `pacman -Sw <pkg>` | 只下载不安装 |
233
+ | `pacman -Sc` | 删除未使用的缓存包 |
234
+ | `pacman -Scc` | 删除所有缓存(含仓库数据) |
235
+ | `pacman -Sp <pkg>` | 打印将要安装的内容(干运行) |
236
+
237
+ ### 删除(-R)
238
+
239
+ | 命令 | 说明 |
240
+ |------|------|
241
+ | `pacman -R <pkg>` | 删除包 |
242
+ | `pacman -Rs <pkg>` | 删除包及未使用的依赖 |
243
+ | `pacman -Rn <pkg>` | 删除包及其配置文件 |
244
+ | `pacman -Rns <pkg>` | 删除包、依赖和配置文件 |
245
+ | `pacman -Rc <pkg>` | 级联删除:删除依赖该包的所有包 |
246
+ | `pacman -Rdd <pkg>` | 跳过依赖检查强制删除 |
247
+ | `pacman -Rp <pkg>` | 打印将要删除的内容(干运行) |
248
+
249
+ ### 查询(-Q)
250
+
251
+ | 命令 | 说明 |
252
+ |------|------|
253
+ | `pacman -Q` | 列出所有已安装的包 |
254
+ | `pacman -Qe` | 列出显式安装的包 |
255
+ | `pacman -Qd` | 列出作为依赖安装的包 |
256
+ | `pacman -Qdt` | 列出孤儿包(未使用的依赖) |
257
+ | `pacman -Qi <pkg>` | 显示详细包信息 |
258
+ | `pacman -Ql <pkg>` | 列出包拥有的文件 |
259
+ | `pacman -Qo <file>` | 查询文件属于哪个包 |
260
+ | `pacman -Qs <keyword>` | 搜索已安装的包 |
261
+ | `pacman -Qk [pkg]` | 验证已安装包的文件完整性 |
262
+
263
+ ### 其他
264
+
265
+ | 命令 | 说明 |
266
+ |------|------|
267
+ | `pacman -U <file>` | 安装本地包文件(.deb/.pkg.tar.zst) |
268
+ | `pacman -D --asdeps <pkg>` | 将包标记为依赖 |
269
+ | `pacman -D --asexplicit <pkg>` | 将包标记为显式安装 |
270
+ | `pacman -T <pkg>` | 检查依赖是否满足 |
271
+ | `pacman -F <file>` | 搜索提供该文件的包 |
272
+ | `pacman -V` | 显示版本号 |
273
+
274
+ ### 内置工具
275
+
276
+ | 命令 | 说明 |
277
+ |------|------|
278
+ | `pacman-conf` | 打印解析后的配置(类似 Arch 的 `pacman-conf`)。查看每个仓库的 Server URL、Type、Dist、Components。 |
279
+ | `makepkg` | 从 PKGBUILD 文件构建 Arch Linux 包。支持 `--syncdeps`、`--install`、`--clean`、源码下载和 `.pkg.tar.zst` 创建。 |
280
+ | `pacman-debian-setup` | 交互式安装:创建配置、Include 文件、符号链接(`/etc/pacman.conf`、`/usr/local/bin/pacman`)和虚拟 `pacman` dpkg 条目。 |
281
+
282
+ ### 全局参数
283
+
284
+ | 参数 | 说明 |
285
+ |------|------|
286
+ | `--noconfirm` | 跳过确认提示 |
287
+ | `--confirm` | 始终询问确认(默认) |
288
+ | `--needed` | 不重新安装已是最新的包 |
289
+ | `--noscriptlet` | 不执行安装脚本 |
290
+ | `--print` | 干运行:显示将要执行的操作但不实际执行 |
291
+
292
+ ### 配置选项
293
+
294
+ | 选项 | 说明 |
295
+ |------|------|
296
+ | `Color` | 启用彩色输出(放在 `[options]` 段) |
297
+ | `Architecture` | 设置目标架构(默认 `auto`) |
298
+ | `IgnorePkg` | 跳过指定包的升级 |
299
+
300
+ ## 依赖引擎
301
+
302
+ 依赖解析器(`src/core/deps.ts`)支持:
303
+
304
+ - 带版本约束的包名解析(`>=`、`<=`、`=`)
305
+ - OR 依赖(`|`)
306
+ - 架构限定符(如 `:arm64`、`:amd64`)
307
+ - Debian(逗号分隔)和 Arch(空格分隔)两种格式
308
+ - 带预加载 DB 状态的 BFS 解析
309
+ - 已安装和待安装包之间的冲突检测
310
+ - 系统包保护(glibc、libc6 等)
311
+
312
+ 版本比较委托给 `dpkg --compare-versions`,带有数字/字符串回退。
313
+
314
+ ## 架构
315
+
316
+ ```
317
+ src/
318
+ ├── cli/pacman.ts # CLI 参数解析和分发
319
+ ├── core/ # 包格式解析器、依赖引擎
320
+ │ ├── ar.ts # ar 归档解析器
321
+ │ ├── tar.ts # tar 提取器
322
+ │ ├── deb.ts # .deb 包解析器
323
+ │ ├── pkgfile.ts # .pkg.tar.zst 解析器
324
+ │ ├── compress.ts # gz/xz 解压缩
325
+ │ ├── control.ts # Debian control 文件解析器
326
+ │ └── deps.ts # 依赖解析引擎
327
+ ├── db/
328
+ │ ├── localdb.ts # 目录式本地包数据库
329
+ │ ├── database.ts # 带事务的 DB 封装
330
+ │ └── dpkg-compat.ts # dpkg 状态文件读写
331
+ ├── ops/
332
+ │ ├── install.ts # 包安装
333
+ │ ├── remove.ts # 包删除
334
+ │ ├── query.ts # 所有 -Q 查询
335
+ │ └── upgrade.ts # 同步 + 升级流程
336
+ ├── repo/
337
+ │ ├── repository.ts # 仓库同步、下载、JSONL 缓存
338
+ │ └── config.ts # pacman.conf 解析器(支持 Include)
339
+ ├── scripts/
340
+ │ └── setup.ts # 交互式安装脚本
341
+ ├── makepkg/
342
+ │ ├── index.ts # makepkg 主入口
343
+ │ ├── pkgbuild.ts # PKGBUILD 解析器
344
+ │ ├── source.ts # 源码下载/解压
345
+ │ ├── build.ts # build()/package() 执行
346
+ │ └── printsrcinfo.ts # .SRCINFO 生成
347
+ ├── ui/ # 用户界面(提示、格式化)
348
+ └── index.ts # 入口
349
+ ```
350
+
351
+ ## libalpm C 库
352
+
353
+ ```
354
+ lib/pac4deb/
355
+ ├── Makefile # 用 gcc 构建,目标 libalpm.so
356
+ ├── include/
357
+ │ ├── alpm.h # 公共 libalpm API 头文件
358
+ │ └── alpm_list.h # 链表头文件
359
+ └── src/
360
+ ├── libalpm.c # 核心实现(handle、db、pkg、JSON 解析器)
361
+ ├── stubs_manual.c # ~200 个不常用 libalpm 函数的桩实现
362
+ └── alpm_list.c # 链表实现
363
+ ```
364
+
365
+ 构建:`make -C lib/pac4deb`
366
+ 安装:`sudo make -C lib/pac4deb install`
367
+
368
+ ## yay / AUR 支持
369
+
370
+ 通过内置 libalpm,`yay` 可与 `pacman-debian` 配合使用:
371
+
372
+ ```bash
373
+ # 安装 yay(需要 Go)
374
+ sudo apt install golang-go
375
+ git clone https://aur.archlinux.org/yay.git /tmp/yay
376
+ cd /tmp/yay && go build -o /usr/local/bin/yay
377
+
378
+ # 与 pacman-debian 配合使用
379
+ PACMAN=/usr/local/bin/pacman yay -Ss ponysay
380
+ PACMAN=/usr/local/bin/pacman sudo -E yay -S ponysay
381
+ ```
382
+
383
+ 注意:依赖 `python`(而非 `python3`)的 AUR 包在 Debian 12 上无法解析,
384
+ 因为系统包名是 `python3`。安装 `python-is-python3` 或创建符号链接可解决。
385
+
386
+ ## 构建
387
+
388
+ ```bash
389
+ pnpm install
390
+ pnpm build # tsc + C 库
391
+ # 或分步执行:
392
+ pnpm exec tsc
393
+ make -C lib/pac4deb # 构建 libalpm.so
394
+ ```
395
+
396
+ ## 项目状态
397
+
398
+ 该项目在 v7.1.0 时更名为 `pacman-debian`。目前在 Debian 12 上
399
+ 可用于日常包管理。已有功能:
400
+
401
+ - **性能优化**:`packages.idx` 索引实现亚秒级单包查找。`-Ss` 只扫索引
402
+ (不解析 JSON)。全量 `-Sl` 通过索引 seek。总共约 64k 包。
403
+ - **并行同步**:多仓库并发下载,每仓库独立进度行。HTTP 条件请求(304)
404
+ 跳过未变更仓库。
405
+ - **多语言**:通过 `$LANG` 自动切换中英文。消息目录在 `src/i18n/`。
406
+ - **颜色输出**:遵守 `pacman.conf` 的 `Color` 选项。颜色方案匹配官方
407
+ pacman(品红=仓库、绿=包名、红=错误)。
408
+ - **权限分离**:查询命令(`-Q`、`-Ss`、`-Si`、`-Sp`、`-Rp`)无需 root。
409
+ 写操作需要 `sudo`。
410
+
411
+ 主要限制:
412
+
413
+ - **Arch ARM 二进制仓库需要 glibc 2.38+** — Debian 12 自带 2.36。
414
+ 本地 `makepkg` 构建可正常使用。
415
+ - **yay/AUR**:libalpm 桩库支持包搜索和依赖解析,但复杂 AUR 依赖链
416
+ 可能因 Debian/Arch 包名差异而失败。
417
+ - **AUR 助手集成**仅测试了 yay(paru、pamac 等未测试)。
418
+
419
+ ## 许可证
420
+
421
+ GNU General Public License v3.0
package/dist/ar.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export interface ArMember {
2
+ name: string;
3
+ size: number;
4
+ data: Buffer;
5
+ }
6
+ export declare function parseAr(data: Buffer): ArMember[];
7
+ export declare function parseDebFile(filePath: string): ArMember[];
8
+ //# sourceMappingURL=ar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar.d.ts","sourceRoot":"","sources":["../src/ar.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiDhD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,CAGzD"}
package/dist/ar.js ADDED
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseAr = parseAr;
37
+ exports.parseDebFile = parseDebFile;
38
+ const fs = __importStar(require("node:fs"));
39
+ function parseAr(data) {
40
+ const members = [];
41
+ let offset = 0;
42
+ const magic = data.subarray(0, 8).toString('ascii');
43
+ if (magic !== '!<arch>\n') {
44
+ throw new Error(`Not a valid ar archive: bad magic "${magic}"`);
45
+ }
46
+ offset = 8;
47
+ let strTable = null;
48
+ while (offset < data.length) {
49
+ if (offset + 60 > data.length)
50
+ break;
51
+ const nameRaw = data.subarray(offset, offset + 16).toString('ascii');
52
+ const dateStr = data.subarray(offset + 16, offset + 28).toString('ascii').trim();
53
+ const uidStr = data.subarray(offset + 28, offset + 34).toString('ascii').trim();
54
+ const gidStr = data.subarray(offset + 34, offset + 40).toString('ascii').trim();
55
+ const modeStr = data.subarray(offset + 40, offset + 48).toString('ascii').trim();
56
+ const sizeStr = data.subarray(offset + 48, offset + 58).toString('ascii').trim();
57
+ const headerMagic = data.subarray(offset + 58, offset + 60).toString('ascii');
58
+ if (headerMagic !== '`\n')
59
+ break;
60
+ const size = parseInt(sizeStr, 10);
61
+ if (isNaN(size))
62
+ break;
63
+ offset += 60;
64
+ const content = data.subarray(offset, offset + size);
65
+ const rawName = nameRaw.replace(/\//g, '').trim();
66
+ if (rawName === '//' && strTable === null) {
67
+ strTable = content.toString('ascii').split('\n').map(s => s.replace(/\0/g, '').trim()).filter(Boolean);
68
+ }
69
+ else {
70
+ let name;
71
+ if (rawName.startsWith('/') && strTable) {
72
+ const idx = parseInt(rawName.slice(1), 10);
73
+ name = strTable[idx] || rawName;
74
+ }
75
+ else {
76
+ name = rawName.replace(/\/$/, '');
77
+ }
78
+ members.push({ name, size, data: content });
79
+ }
80
+ offset += Math.ceil(size / 2) * 2;
81
+ }
82
+ return members;
83
+ }
84
+ function parseDebFile(filePath) {
85
+ const data = fs.readFileSync(filePath);
86
+ return parseAr(data);
87
+ }
88
+ //# sourceMappingURL=ar.js.map
package/dist/ar.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar.js","sourceRoot":"","sources":["../src/ar.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,0BAiDC;AAED,oCAGC;AA9DD,4CAA8B;AAQ9B,SAAgB,OAAO,CAAC,IAAY;IAClC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,GAAG,CAAC,CAAC;IAEX,IAAI,QAAQ,GAAoB,IAAI,CAAC;IAErC,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM;YAAE,MAAM;QAErC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE9E,IAAI,WAAW,KAAK,KAAK;YAAE,MAAM;QAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM;QAEvB,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAElD,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC1C,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzG,CAAC;aAAM,CAAC;YACN,IAAI,IAAY,CAAC;YACjB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function parseArgs(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=pacman.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pacman.d.ts","sourceRoot":"","sources":["../../src/cli/pacman.ts"],"names":[],"mappings":"AA0FA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyN7D"}