![如何从 PPA 中挑选软件包?](https://linux22.com/image/829151/%E5%A6%82%E4%BD%95%E4%BB%8E%20PPA%20%E4%B8%AD%E6%8C%91%E9%80%89%E8%BD%AF%E4%BB%B6%E5%8C%85%EF%BC%9F.png)
有没有办法从你添加的 ppa 存储库中挑选软件包?也就是说,从更新中排除一些软件包,同时包含其他软件包?
例如,我想要只是来自的 chromium-browser 包这个存储库但其他的不行。所以我不想sudo apt-get upgrade
让该 ppa 的其他软件包(除了 chromium-browser)覆盖我现有的软件包,只想安装这一个。
我意识到,如果我误读了依赖项并排除了包含所需的依赖项,那么这无异于搬起石头砸自己的脚,但在这种情况下,我确实知道其他包不是该包的依赖项。
这有可能吗?也许有一些白名单/黑名单文件之类的东西?
答案1
找到了一种方法来做到这一点。
诀窍是使用二固定子句。第一个子句禁止 PPA 中的所有软件包,第二个子句选择您想要的软件包。
因此对于上面的例子,我首先像往常一样添加 ppa:
$ sudo add-apt-repository ppa:webapps/preview
...
$ sudo apt-get update
...
现在,如果我运行 apt-cache policy,它将显示有可用的较新版本的 chromium-browser,并且它将通过升级进行安装,因为它与我当前的 chromium-browser 具有相同的优先级(500)。
$ sudo apt-cache policy chromium-browser
chromium-browser:
Installed: 18.0.1025.168~r134367-0ubuntu0.12.04.1
Candidate: 20.0.1132.47~r144678-0precise1+webapps3
Version table:
20.0.1132.47~r144678-0precise1+webapps3 0
500 http://ppa.launchpad.net/webapps/preview/ubuntu/ precise/main amd64 Packages
*** 18.0.1025.168~r134367-0ubuntu0.12.04.1 0
500 http://us.archive.ubuntu.com/ubuntu/ precise-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu/ precise-security/universe amd64 Packages
500 http://ppa.launchpad.net/chromium-daily/beta/ubuntu/ precise/main amd64 Packages
100 /var/lib/dpkg/status
18.0.1025.151~r130497-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
E: Unable to parse package file /etc/apt/preferences.d/webapps-preview-pin-400 (1)
$
就该软件包而言,这很好,但我不想安装此 ppa 中的其他软件包(其优先级也为 500)。现在,如果我尝试升级,我将从该存储库中获得我想要的不仅仅是铬软件包:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages have been kept back:
bamfdaemon gwibber gwibber-service gwibber-service-facebook gwibber-service-twitter indicator-appmenu libbamf0 libbamf3-0 shotwell
The following packages will be upgraded:
chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg gwibber-service-identica indicator-messages indicator-status-provider-mc5
indicator-status-provider-pidgin libindicator-messages-status-provider1
8 upgraded, 0 newly installed, 0 to remove and 9 not upgraded.
Need to get 25.3 MB of archives.
After this operation, 5,034 kB of additional disk space will be used.
Do you want to continue [Y/n]?
因此,我可以做的是告诉 apt,我希望该 ppa 中的所有软件包(在本例中为 webapps-preview)都有一个降低优先事项除了那些名字里有“铬”的物质。其机制是固定包
我在 /etc/apt/preferences.d/ 中创建了一个包含两个子句的文件。第一个子句表示为 webapps-preview ppa 中的所有软件包赋予比常规软件包更低的优先级(这样它们不是即使版本号更高,也优先安装。第二子句部分覆盖了第一子句,即赋予该 ppa 中名称中带有“chromium”的软件包与其他软件包相同的优先级,以便安装该软件包(通过使其具有更高的版本号)。
$ cat /etc/apt/preferences.d/webapps-preview-pin-400
Package: *
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 400
Package: *chromium*
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 500
为了识别“Pin:release”选项的正确字符串,我们可以再次使用 apt-cache 策略。
$ apt-cache policy
...
500 http://ppa.launchpad.net/webapps/preview/ubuntu/ precise/main i386 Packages
release v=12.04,o=LP-PPA-webapps-preview,a=precise,n=precise,l=preview,c=main
origin ppa.launchpad.net
...
对于 apt 版本 < 0.8.14,必须明确指定固定包,因为通配符不起作用:
$ cat /etc/apt/preferences.d/webapps-preview-pin-400
Package: *
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 400
Package: chromium-browser chromium-codecs-ffmpeg chromium-browser-l10n chromium-codecs-ffmpeg-extra
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 500
现在,当我尝试升级时,我只会从该 ppa 获得我想要的软件包,而不会获得其他软件包。所有这些都为我精心挑选:
$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 25.1 MB of archives.
After this operation, 5,026 kB of additional disk space will be used.
Do you want to continue [Y/n]?
答案2
您还可以使用选择器选择要安装的版本?origin
:
匹配源与正则表达式 origin 匹配的软件包版本。例如,“!?origin(debian)”将查找系统上的任何非官方软件包(不是来自 Debian 档案的软件包)。
因此,根据您的具体情况,您可以使用:
sudo aptitude install !?origin(LP-PPA-webapps-preview) chromium
或者您可以使用以下方式指定版本<packagename>=<version>
:
sudo apt-get install chromium=20.0.1132.47~r144678-0precise1+webapps3
答案3
你实际上可以通过 Synaptic “挑选”某些软件包,而且它的非常很简单。它的工作原理如下:
如果你只想对某些 PPA 执行此操作,请在 Synaptic 窗口中选择“Origin”(左下角),然后选择要更改的 PPA
选择所有您不想再自动升级的软件包。
选择菜单“软件包/锁定版本”。所有你选择的软件包将不再自动升级,直到你再次解锁它们。