我尝试根据多个字段来固定软件包。在我的例子中,是原产地和版本。
我这样做的具体原因是 ping RabbitMQ 特定版本的 Erlang 版本。我想阻止安装另一个版本的 Erlang(来自 RabbitMQ 的存储库)或我想要的版本(来自另一个存储库)。在 RabbitMQ Bintray 存储库上,我使用 sources.list 中的“component”字段限制了版本(他们为每个主要 Erlang 版本提供了一个。例如,erlang
将获取所有版本,erlang-23.x
将仅获取 23.* 版本的 Erlang。这不再适用于替换 Bintray 的存储库)(这是必要的,因为基本操作系统可能包含与 RabbitMQ Erlang 存储库相同主要版本的软件包(基于 的 pin origin
),并且 RabbitMQ Erlang 存储库可能包含比我想要运行的 RabbitMQ 支持的更新的 Erlang 版本(基于版本的 pin))
我的sources.list
摘录:
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main
我找不到有关该Pin
参数语法的详细信息。(有示例,但没有针对多个字段的示例)
我在文件中尝试过的事情/etc/apt/preferences.d/
:
- 多次参赛:
Package: erlang*
Pin: origin dl.cloudsmith.io
Pin-Priority: 1000
Package: erlang*
Pin: version 1:23.*
Pin-Priority: 1000
这会导致 cloudsmith 包和所有版本 23.x 版本都设置为优先级 1000。(如果使用不同的优先级,则仅应用第一个匹配的优先级 - 即所有 cloudsmith.io 包从第一个块获得优先级,cloudsmith 23.x 包不会从第二个块获得优先级)
- 两条
Pin
记录:
Package: erlang*
Pin: origin dl.cloudsmith.io
Pin: version 1:23.*
Pin-Priority: 1000
这导致只有第一个字段被应用(origin
在本例中)
- 多个以空格分隔的条目:
Package: erlang*
Pin: origin dl.cloudsmith.io version 1:23.*
Pin-Priority: 1000
这与任何包都不匹配。
(我检查了结果apt-cache policy
并交换了版本和来源以查看是否同时考虑了两者,还是只考虑了一个)
(另一个不太优雅的解决方案是降低操作系统软件包的优先级。如果添加更多存储库,此方法将会失败)
答案1
man 5 apt_preferences 解释可以使用逗号分隔的列表定义多个标准,如下所示:
Pin: origin dl.cloudsmith.io, version 1:23.*