我正在尝试回滚 Pigpio 安装以测试更改,但遇到了这个问题:
pi@MyPi:~ $ sudo apt install pigpio=1.68-3+rpi1
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
pigpio : Depends: libpigpiod-if2-1 (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: libpigpiod-if1 (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: libpigpiod-if-dev (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: pigpio-tools (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: libpigpio1 (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: libpigpio-dev (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
Depends: pigpiod (= 1.68-3+rpi1) but 1.71-0~rpt1 is to be installed
E: Unable to correct problems, you have held broken packages.
最后一行包含一条错误消息,但它似乎不是问题所在:
pi@MyPi:~ $ apt-mark showhold
pi@MyPi:~ $
如果我添加一个包裹,它确实会显示为保留状态。
注意,我还删除了 Pigpio:
pi@MyPi:~ $ sudo apt purge pigpio -y && sudo apt autoremove -y
我可以通过手动将每个包指定为旧版本来解决我的问题,但这似乎没有必要。
pi@MyPi:~ $ sudo apt install pigpio=1.68-3+rpi1 libpigpiod-if2-1=1.68-3+rpi1 libpigpiod-if1=1.68-3+rpi1 libpigpiod-if-dev=1.68-3+rpi1 pigpio-tools=1.68-3+rpi1 libpigpio1=1.68-3+rpi1 libpigpio-dev=1.68-3+rpi1 pigpiod=1.68-3+rpi1
特别是,我认为这意味着将来如果我删除pigpio
,它的依赖项也不会被清除。
apt
我缺少一些简单的选择吗?
答案1
apt
拒绝降级您已经安装的软件包,除非您明确要求这样做。
正如您所发现的,实现此目的的一种方法是在命令中手动指定每个版本install
。如果您想确保在pigpio
删除时删除依赖项,您可以auto
在apt-mark
安装后将其标记为 。
更简单的方法就是先卸载那些升级的包:
apt-get remove pigpio
apt-get autoremove
apt-get install pigpio=1.68-3+rpi1
这通常应该可以工作,但由于某种原因它不能工作pigpio
,可能是因为默认版本中只有一个包。起作用的pigpio
是该选项,您可以使用或-t release
找出软件包属于哪个版本:apt-cache
apt policy
pi@raspberrypi:~ $ apt-cache madison pigpio
pigpio | 1.78-1+rpi1 | http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages
pigpio | 1.68-3+rpi1 | http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
pi@raspberrypi:~ $ apt policy pigpio
pigpio:
Installed: (none)
Candidate: 1.78-1+rpi1
Version table:
1.78-1+rpi1 500
500 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages
1.68-3+rpi1 500
500 http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
pi@raspberrypi:~ $ sudo apt-get -t buster install pigpio
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libpigpio-dev libpigpio1 libpigpiod-if-dev libpigpiod-if1 libpigpiod-if2-1 pigpio-tools pigpiod
The following NEW packages will be installed:
libpigpio-dev libpigpio1 libpigpiod-if-dev libpigpiod-if1 libpigpiod-if2-1 pigpio pigpio-tools pigpiod
0 upgraded, 8 newly installed, 0 to remove and 7 not upgraded.
Need to get 328 kB of archives.
After this operation, 990 kB of additional disk space will be used.
如果autoremove
没有删除所有依赖项,则意味着系统中的其他内容依赖于这些包。您需要卸载该东西,或者将其与pigpio
.请注意,在这种情况下手动指定旧的软件包版本也不起作用。
答案2
我在同样的情况下挣扎并找到了一个对我有用的解决方案。
就我而言,我需要在psql-dev
(postgresql) 版本之间切换,因此首先我必须添加 postgresql apt 存储库以及可用于我的发行版安装的每个版本:
cat /etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt xenial-pgdg 9.4 9.5 9.6 10 11
仅凭这一点,您将无法由于遇到的错误11*
而从版本降级到版本。9.6*
该技巧的解释如下本文:
cat /etc/apt/preferences.d/xenial-pgdg.pref
Explanation: postgresql: xenial-pgdg
Package: *
Pin: release c=9.6
Pin-Priority: 1001
在固定优先级为1001
或更高的版本后,它将安装该版本的依赖项,在本例中所有依赖项都匹配 version 9.6*
。
答案3
当降级依赖项时,系统apt
需要知道每个依赖项应该降级到哪个版本。
在实践中,您经常想要做的是将包及其依赖项降级为给定的发布使用选项-t
.因此你将使用sudo apt-get -t=<target release> install <package-name>
但有一个问题:该版本必须配置为允许降级。这意味着它的首选项必须大于,1000
否则 apt 将保留当前安装的版本。欲了解更多详情,请参阅https://linux-tips.com/t/downgrade-a-package-with-its-dependencies/261
答案4
根据易于手动,您可以通过执行以下命令之一来完成此操作:
sudo apt-get install <package-name>=<package-version-number>
或者
sudo apt-get -t=<target release> install <package-name>