我发现这奇怪的事情发生在哪里
pacman -S -w awesome xorg-xinit xorg-server xorg-server-utils
吃豆人不下载所有必需的依赖项。
下载软件包的原因是因为我正在创建一个本地存储库,其中仅包含我需要的特定软件包。(而不是下载整个存储库,因为 Arch 社区不希望你这样做,因为带宽限制,这是尊重)
现在,上面定义的包下载得很好,它确实下载xorg-server
等等,并-w
确保它们不会被安装。但-S
还应该下载所有由于某种原因而没有下载的依赖项。
稍后尝试使用本地存储库安装上述软件包时的输出结果为:
warning: cannot resolve "xorg-xset", a dependency of "xorg-server-utils"
warning: cannot resolve "xorg-xauth", a dependency of "xorg-xinit"
这样的例子不胜枚举...检查存储库,肯定是软件包丢失了并且从未在任何地方下载过。
有什么想法吗?我错过了什么吗?逻辑上还是参数上?
答案1
正如所指出的切实和恶魔狂人3于#archlinuxirc频道,这是因为pacman
如果本地已安装,则不会重新下载任何内容。但它会下载您特别指示的任何内容,想想就很有意义。
这意味着,如果您尝试下载用于自定义/本地存储库的软件包,您需要确保要下载的软件包未在本地安装,或者执行以下选项之一:
临时/本地使用空包数据库
pacman -y --dbpath /tmp ...
这会造成一种错觉,即本地没有安装任何内容,并且下载了所需的每个包。这也要求您这样做,-y
因为您的组成数据库中没有主包列表。
执行系统升级
pacman -Syuw ...
这应该重新安装/升级任何软件包(无论是否已安装)。
笔记:未经审核的(我对 pacman 的逻辑知之甚少,并且正处于测试它的时间困境中)
隔离下载的文件
正如评论中指出的,您很可能希望将下载的文件放在一个单独的目录中,以便您可以使用它们,这是通过以下方式完成的--cachedir
:
pacman --cachedir /tmp/somewhere ...
最后的例子
sudo pacman -Syw --cachedir /tmp/somewhere --dbpath /tmp/pacmandb base base-devel linux linux-firmware
然后你很可能想使用将其添加到镜像中回购添加通过发出类似的内容:
repo-add /tmp/somewhere/my_mirror.db.tar.gz /tmp/somewhere/{*.pkg.tar.xz,*.pkg.tar.zst}
使用生成依赖列表扩展
expac -S '%E' -l '\n' base base-devel linux linux-firmware | tr '\n' ' '
呼吁expac
<package string>
(您要下载的所有软件包)将为您提供运行您正在下载的任何内容所需的软件包列表。您可以使用此列表来获取/添加到计划安装的现有软件包字符串中。
expac
默认情况下,将单行中的每个单独依赖项分开,但将它们在包之间拆分,因此我们将每个单行字符串转换为多个新行,然后使用 tr 将换行符转换为空格。
我更喜欢这个expac
版本,因为它以编程方式保存并且可以在许多脚本中使用,但是快速且“脏”的版本只是重定向 pacman 检查的数据库。