通常在我的 Ubuntu 16.04 LTS 上,我使用 APT-pin 功能锁定软件包版本。
例如,如果我想固定到1.5.3-1ubuntu1meld
版本,我会创建以下 pin 文件:
cat <<EOF | sudo tee /etc/apt/preferences.d/pin-meld
Package: meld
Pin: version 1.5.3-1ubuntu1
Pin-Priority: 1337
EOF
此文件在系统范围内应用设置:apt
、、和 GUI 工具apt-get
,aptitude
例如synaptic
并muon
尊重它。
我知道其他机制 - apt-mark
。让我们假设。我的起点 - 我手动安装了meld_1.5.3-1ubuntu1,它的引脚被移除。
$ apt-mark showhold
$ apt-cache policy meld
meld:
Installed: 1.5.3-1ubuntu1
Candidate: 3.14.2-1
Version table:
3.14.2-1 500
500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
500 http://archive.ubuntu.com/ubuntu xenial/universe i386 Packages
*** 1.5.3-1ubuntu1 100
100 /var/lib/dpkg/status
然后我持有已安装的版本。
$ sudo apt-mark hold meld
meld set on hold.
$ dpkg -l | grep meld
hi meld 1.5.3-1ubuntu1 all graphical tool to diff and merge files
APT 标记显示它处于暂停状态。但是apt-cache policy meld
没有任何变化
$ apt-cache policy meld
meld:
Installed: 1.5.3-1ubuntu1
Candidate: 3.14.2-1
Version table:
3.14.2-1 500
500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
500 http://archive.ubuntu.com/ubuntu xenial/universe i386 Packages
*** 1.5.3-1ubuntu1 100
100 /var/lib/dpkg/status
apt-get upgrade
保留meld
的报告:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
meld
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
但是,如果我aptitude
以交互模式启动,我将meld
在Upgradable Packages中:
Actions Undo Package Resolver Search Options Views Help
C-T: Menu ?: Help q: Quit u: Update g: Preview/Download/Install/Remove Pkgs
aptitude 0.7.4
--\ Upgradable Packages (1)
--\ gnome - The GNOME Desktop Environment (1)
--\ universe - Unsupported Free Software. (1)
ih meld 1.5.3-1ubuntu1 3.14.2-1
如果我不小心选择了Actions -> Cancel pending actions,则保留将被删除。
据我所知,synaptic
忽略apt-mark
标记,其锁定版本功能的工作方式不同。
meld
此处列为已安装(可升级)。标记所有升级按钮不会自动选择它,但是标记升级可能会意外升级包。
Muon 以相同的方式处理由 . 持有的包裹apt-mark
。但有趣的是,它的选项Lock at Current Version将 pin-file 写入/etc/apt/preferences.d/meld
.
我是否正确理解 APT-pin 比 更可靠apt-mark
?
是的,pinning 比
apt-mark
.我发现了什么:
过去 12-14 年 Synaptic 使用自己的固定文件 (/var/lib/synaptic/preferences) - 请参阅启动板上的错误 42178。对于系统范围,可能需要在
/etc
和 Synaptic之间设置符号链接所以它是解决方法,不推荐在 Synaptic 中锁定版本的方法(此文件不由
apt-get
and读取aptitude
)。Muon 在
/etc/apt/preferences.d
.aptitude
有两个错误:apt-mark
(请参阅我在启动板上的错误 1747189)。apt-mark
在单击Actions -> Cancel pending actions后设置的内容会丢失(请参阅我在启动板上的错误 1747191)。但是在 18.04 LTS
aptitude
中没有这样的错误,这很棒。所以我的结论是:
apt-mark
只有当你安装/删除/升级软件时才可以使用apt-get
,否则你应该使用固定(即/etc/apt/preferences.d/
),它更可靠和直接。注意:为防止封装安装管脚优先级应为负:
例如
Pin-Priority: -10
。