我如何从 PPA 中挑选包裹?

yuv*_*lio 49 apt ppa

有没有办法从您添加的 ppa 存储库中挑选软件包?也就是说,在包括其他人的同时排除一些更新?

例如,我想要这个存储库中的chromium-browser 包,而不是其他的。所以我不希望我的sudo apt-get upgradeppa 的其他(除了chromium-browser)包安装在我现有的包上,只是那个包。

我意识到这是一个许可证,如果我误读了依赖项并排除了我所包含的依赖项所需要的依赖项,那么这是一个向自己开枪的许可证,但我知道在这种情况下其他包不是那个依赖项的事实。

这是可能吗?也许有一些白名单/黑名单文件之类的?

yuv*_*lio 63

找到了一种方法。

诀窍是使用两个固定子句。第一个禁止来自 PPA 的所有包,第二个选择你想要的包。

所以对于上面的例子,我首先像往常一样添加 ppa:

$ sudo add-apt-repository ppa:webapps/preview
...
$ sudo apt-get update
...
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行 apt-cache 策略,它会告诉我有一个新版本的 Chromium 浏览器可用,并且它将安装升级,因为它与我当前的 Chromium 浏览器具有相同的优先级(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)
$ 
Run Code Online (Sandbox Code Playgroud)

就该软件包而言,这很棒,但我不希望安装此 ppa 中的其他软件包(也有 500 优先级)。现在,如果我尝试升级,我将从该存储库中获得的不仅仅是我想要的 Chromium 包:

$ 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]? 
Run Code Online (Sandbox Code Playgroud)

所以我能做的就是告诉 apt 我希望 ppa 中的所有包,在这种情况下是 webapps-preview,除了名称中带有“chromium”的包之外,具有较低的优先级。这个机制是固定一个包

我在 /etc/apt/preferences.d/ 中创建了一个包含两个子句的文件。第一个说给 webapps-preview ppa 中的所有包一个比常规包低的优先级(这样即使它们具有更高的版本号,它们也不是首选。第二个子句部分覆盖了第一个子句,说给包在名称中带有“chromium”的 ppa 与其他软件包具有相同的优先级,以便安装它(通过它具有更高的版本号)。

$ 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
Run Code Online (Sandbox Code Playgroud)

为了识别“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
...
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试升级时,我只能从该 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]?
Run Code Online (Sandbox Code Playgroud)

  • 相当复杂,恕我直言。 (5认同)
  • 我不同意,这对于某人喜欢的东西来说非常简单。很高兴获得有关识别 ppa 的 Pin 名称的所有说明。 (5认同)

Bra*_*iam 10

您还可以使用选择?origin器选择要安装的版本:

匹配源与正则表达式源匹配的包版本。例如,“!?origin(debian)”会在你的系统上找到任何非官方的包(不是来自 Debian 档案库的包)。

因此,在您的特定情况下,您可以使用:

sudo aptitude install !?origin(LP-PPA-webapps-preview) chromium
Run Code Online (Sandbox Code Playgroud)

或者您可以使用<packagename>=<version>以下命令指定版本:

sudo apt-get install chromium=20.0.1132.47~r144678-0precise1+webapps3
Run Code Online (Sandbox Code Playgroud)


Mro*_*kii 5

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

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

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

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