如何从PPA中挑选包装?


45

有没有办法从您添加的ppa存储库中挑选软件包?也就是说,要排除某些更新,而又包括其他?

例如,我需要该存储库中的Chrome浏览器软件包,而不需要其他。因此,我不希望sudo apt-get upgrade将ppa的其他(铬浏览器除外)软件包安装在我现有的软件包之上。

我意识到,如果我误解了依赖项并排除了我所包含的依赖项所需要的依赖项,那这是一种授权,可以将自己打倒在脚下,但是在这种情况下,我知道一个事实,即其他软件包不是该依赖项的依赖项。

这是可能吗?也许有一些白名单/黑名单文件或其他东西?


我会通过Synaptic的原因有三个:Ubuntu放弃了它作为软件更新程序,转而支持Ubuntu Software Center,我没有看到Synaptic停止从已安装文件的PPA升级的方法(这是我的问题),并且我相对于GUI,更喜欢使用命令行解决方案。最终找到了可行的方法(请参阅下面的答案)。
yuvilio

2
软件中心用于安装和删除软件,更新管理器用于更新,您可能已经在Synaptic中使用了固定功能,因此其他软件包不会升级,对于不想与终端机打交道的新用户也是如此。 GUI将是首选,当然您的答案几乎是正确的。
乌里埃雷拉(Uri Herrera)

有些事情您根本无法通过Software-Center完成(对于Synaptic来说很容易)。并非所有人(尤其是新手)都对命令行感到满意。
Mrokii

@Mrokii我同意我的方法不适合初学者。您认为,Uri Herrera所写的Synaptic答案在这方面要好一些。我会让尝试它的人给它评分。
yuvilio

Answers:


61

找到了一种方法。

诀窍是使用两个固定子句。第一个从PPA禁止所有软件包,第二个从中选择所需的软件包。

因此,对于上面的示例,我首先像往常一样添加ppa:

$ sudo add-apt-repository ppa:webapps/preview
...
$ sudo apt-get update
...

现在,如果我运行apt-cache策略,它将告诉我有一个更新版本的铬浏览器可用,并且它将安装升级,因为它的优先级(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]? 

因此,我能做的就是告诉我,我希望该ppa中的所有软件包(在这种情况下为webapps-preview)具有较低的优先级,名称中带有“ chromium” 的软件包除外。该机制是固定包

我在/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
...

对于<0.8.14版的apt版本,必须明确指定固定包,因为通配符不起作用:

$ 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]?

5
非常复杂,恕我直言。
Mrokii

5
我不同意,对于喜欢的人来说,这很简单。很高兴获得有关识别ppa的Pin名称的所有说明。
Nicholi 2014年

该特定答案适用于那些希望确保apt始终喜欢特定存储库软件包的用户。如果你想一次性的解决方案,尝试这样的回答还是这一个
Braiam

7

您还可以使用选择?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

5

实际上,您可以通过Synaptic“樱桃挑选”某些软件包,这非常容易。它是这样的:

  • 如果您只想对某些PPA执行此操作,请在Synaptic窗口中选择“来源”(左下角),然后选择要更改的PPA

  • 选择所有您不想再自动升级的软件包。

  • 选择菜单“打包/锁定版本”。您选择的所有软件包都不会自动升级,直到您再次将其解锁。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.