如何仅安装软件包的依赖项?


45

运行sudo apt-get install <PACKAGE>将安装该软件包,其依赖项以及任何其他推荐的软件包。

但是,似乎没有办法安装软件包的依赖项并排除软件包本身。

人们将如何去做呢?


只是好奇,您为什么要这样做?
克里斯·哈珀

@ root45:嗯,这是一个独特的情况:我在回购中拥有Python包的源代码。而且还没有开始。我需要安装软件包的依赖项而不安装软件包本身(因为我已经有了代码)。
内森·奥斯曼

1
您难道不可以进行apt-get安装的试运行,然后看看将要安装的内容,然后仅安装除正在编译的应用程序以外的所有内容?
duffydack 2011年

2
或者只是安装它,然后删除该应用程序(但不删除其依赖项)。和/或在构建后安装更新/修复的软件包。
2011年

我需要具有执行此操作的能力,以便可以构建和安装尚未为我的体系结构构建的源软件包。apt-get build-dep安装了构建依赖项,因此apt-get -b source可以运行,但是未安装运行时依赖项,因此dpkg -i *.deb失败。
Trevor Robinson

Answers:


24

这将在软件包的DependsPreDepends字段中安装所有软件包:

sudo apt-get install $(apt-cache depends <PACKAGE> | grep Depends | sed "s/.*ends:\ //" | tr '\n' ' ')

基本上,您需要所有依赖项,过滤出(Pre)Depends,并格式化输出以获取apt-get。

一个问题是像

Depends: pulseaudio
  pulseaudio:i386

或虚拟包裹

Depends: <java6-runtime-headless>
  default-jre-headless
  openjdk-6-jre-headless

因此:小心使用-并非在所有情况下都有效!


1
在很多情况下,这是无法解决的,例如,它将在虚拟包装上完全损坏(打印在尖括号中)。参见示例:askubuntu.com/questions/25361/…–
特雷弗·罗宾逊

感谢您的提示,尽管我不确定如何处理所有这些问题。:-(
htorque 2012年

2
如果可以的话,我想提出AWK的更简单解决方案:sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Sergiy Kolodyazhnyy 2015年

1
我遇到了您上面提到的虚拟软件包问题;sed在管道中进行以下更新对我有用:sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'。在我的情况下,其中的虚拟包< >之前是满足它的包,因此可以< >很好地删除该项目。
berto

5

apt-get build-dep <package> 会成功的


13
那将不起作用,因为该程序包具有不会随一起安装的运行时依赖项apt-get build-dep
内森·奥斯曼

5

如果您不介意复制/粘贴,只需使用即可模拟apt-get安装-s。这样,您将看到将要安装和/或升级的其他软件包,然后从该列表中删除不想安装的软件包名称,瞧。

sudo apt-get install -s <package>


4

要列出未安装的给定软件包的所有依赖关系,可以使用 aptitude

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")'

安装依赖项

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")' -F "%p" | xargs sudo apt-get install

例子

  • 列出依赖项

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • 只显示包装名称

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • 安装依赖项,例如 mc

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p" | xargs sudo apt-get install     
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      mc-data
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1.166 kB of archives.
    After this operation, 5.550 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu/ wily/universe mc-data all 3:4.8.13-3 [1.166 kB]
    Fetched 1.166 kB in 0s (1.250 kB/s)
    Selecting previously unselected package mc-data.
    (Reading database ... 606748 files and directories currently installed.)
    Preparing to unpack .../mc-data_3%3a4.8.13-3_all.deb ...
    Unpacking mc-data (3:4.8.13-3) ...
    Processing triggers for doc-base (0.10.6) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for man-db (2.7.4-1) ...
    Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
    Setting up mc-data (3:4.8.13-3) ...
    

1

您可以解析apt install模拟的输出来执行此操作,以下是一个bash函数可以为您执行此操作:

apt-install-depends() {
    local pkg="$1"
    apt-get install -s "$pkg" \
      | sed -n \
        -e "/^Inst $pkg /d" \
        -e 's/^Inst \([^ ]\+\) .*$/\1/p' \
      | xargs apt-get install
}

用法:

apt-install-depends mopidy

0

要仅安装依赖项,可以使用apt-cache show package | grep Depends。这将为您提供依赖性列表:

apt-cache show apache2 | grep Depends
Depends: apache2-mpm-worker (= 2.2.22-6ubuntu5.1) | apache2-mpm-prefork (= 2.2.22-6ubuntu5.1) | apache2-mpm-event (= 2.2.22-6ubuntu5.1) | apache2-mpm-itk (= 2.2.22-6ubuntu5.1), apache2.2-common (= 2.2.22-6ubuntu5.1)

然后您可以决定使用apt-get安装哪个软件包。aptitude在交互模式下,您还可以找到要选择的软件包,然后安装其依赖项:

在此处输入图片说明

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.