install_if 的 "bug"
qaqland
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