install_if 的 "bug"

qaqlandqaqland
1 min read

猜想原理

install_if 类似反向依赖,所有软件包的匹配规则保存在一起。但是当前检查规则只限制了 pkgname-pkgver-pkgrel 而没有其它约束,也就是说只要本地包与官方包这三个属性恰好冲突,就会触发官方包的 install_if 规则。

第一次发现来自 https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/71847

官方的回复是不支持混合使用不同来源的仓库,所以对工具本身的设计来说不是 bug,但是对用户来说,还是有可能出现类似问题。

验证猜想

这里挑选一个 pkgrel 经常为 0 的大型开源软件,以 Go 项目为主,因为更新比较快,很少像 C 项目一样一直原地 bump,选择了 docker 如下:

我们的目标就是构建一个包和 docker 同名同版本,然后安装这个本地包,看能否则触发出官方 docker 包的自动安装规则。

因为没有 source 所以也不用 checksum 什么的,简单做一下,执行 abuild -r

# Maintainer: qaqland <qaq@qaq.land>
pkgname=docker
pkgver=26.1.5
pkgrel=0
pkgdesc="Test install_if with docker-doc (empty package)"
url="https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/71847"
arch="noarch"
license="MIT"
options="!check"

package() {
        mkdir -p "$pkgdir"
}

来到对应位置安装这个包,验证成功!可以看到我们的 docker 来自本地,但是安装上了 docker-fish-completion 的远程包(不知道为什么不是 doc,挠头.jpg)

qaq@lab ~/p/t/x86_64> ls
APKINDEX.tar.gz       docker-26.1.5-r0.apk
qaq@lab ~/p/t/x86_64> doas apk add docker-26.1.5-r0.apk
(1/2) Installing docker (26.1.5-r0)
(2/2) Installing docker-fish-completion (26.1.5-r0)
OK: 3857 MiB in 1066 packages
qaq@lab ~/p/t/x86_64> grep docker /etc/apk/world
docker><Q1iHz9QdBY263VWJNx3Q2quu0VNTE=
0
Subscribe to my newsletter

Read articles from qaqland directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

qaqland
qaqland