如何下载.deb程序包和所有依赖项?


14

对于有关该主题的所有答案,解决方案是在需要安装软件包的特定计算机A中创建一个文件,其中包含所需的所有依赖项,然后将其下载到另一台计算机中,我们将其称为B。

关键是,我希望存储某些关键软件,需要稍后才能离线安装它们,以防万一我必须格式化自己的桌面。

我真的不在乎计算机中有很多多余的.deb文件,如果我要存储1GB的文件来安装10mb的软件,我真的不在乎。

所以,我想下载任何可能的依赖项。有办法我可以做到吗?


Answers:


22

我会这样:

apt-get download PACKAGE && apt-cache depends -i PACKAGE | awk '/Depends:/ {print $2}' | xargs apt-get download

然后,您可以将其安装dpkg -i *.deb在下载这些文件的目录中。


1
我认为它已经完成了工作,非常感谢。在我再次感谢您之前,我将对其进行更多的测试:)
ebernardes 2015年

您能解释一下awk和xargs命令的作用吗?我刚刚开始使用linux,之前从未见过这2条命令
ebernardes 2015年

apt-cache depends -i将检查PACKAGE的重要依存关系。仅当apt-get download PACKAGE成功从添加到的ppa存储库中找到PACKAGE时,才会执行该操作/etc/apt/sources.list。现在,apt-cache depends -i PACKAGE具有form的输出Depends: dependency-name。我们只需要依赖项的名称,这就是awk所做的-它仅获取第二个字符串。例如,尝试做apt-cache depends -i vim | awk '{print $2}' 。另请注意,&&右边的整行都可以视为一个陈述
Sergiy Kolodyazhnyy 2015年

1
谢谢!但是我做了一些研究,我使用命令sed'/ ^ </ d'删除了apt-cache依赖的一些输出,这已经很好了,但是现在在我尝试的每种情况下都可以使用。非常感谢!
ebernardes 2015年

dpkg -i *.deb不太好,它不会按依赖关系顺序安装软件包。因此,您可能需要重试几次才能安装所有软件包。无论如何要解决?
秘银

1

这是一次性的事情,还是您想不断更新的事情?您是否主要在网上工作,并且只想对所有软件包进行本地备份,以防万一?

您可以安装充当APT代理/缓存的几种服务。您将APT指向本地缓存,它将从Internet下载,并保留所有软件包的本地缓存副本。如果您的网络上有很多计算机且选择了相同的软件包,这将非常有用。

我偏爱的apt缓存大约是,但是还有apt-cacher-ng和其他一些。每种缓存在配置方式上都有细微的差别。

我总是使用最小的netinst安装程序来构建基于Debian的系统,这意味着我的apt缓存通常具有几乎所有软件包来完全构建我的系统。


如果我需要快速安装某些软件(即使它是过时的版本),这也是我要保持的情况,以便以后可以进行更新。我会检查一下,谢谢:)
ebernardes'2

0

运行以下python程序:

import subprocess
package=input("insert package name:")
t=subprocess.run(["apt-cache", "depends", "-i", package], stdout=subprocess.PIPE)
if t.stderr or t.returncode:
    print(t.stdout)
    exit(t.stderr)
#print(":", t.stdout)
needed_pacages=t.stdout.split(b"Depends: ")
print(package, "depends of", needed_pacages)
for choices in needed_pacages:
    one_choice_made=False
    for needed_package in choices.split(b"\n"):
        needed_package=needed_package.strip(b"\n ")
        t=subprocess.run(["apt-get", "download", needed_package])
        if t.stderr or t.returncode:
            print("ERROR: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "package name:", needed_package)
        else:
            one_choice_made = True
            #print("downloaded",vajalik_pakk)
            break
    if not one_choice_made:
        print("could not get one of dependecies", choices)

1
为什么这比公认的答案更好?
RalfFriedl

0

运行以下python3程序:

import subprocess
olemas_olevad_pakid=set()
def r(pakk):
    t=subprocess.run(["apt-get", "download", pakk])
    if t.stderr or t.returncode:
        #print("could not load package: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "paki nimi:", pakk)
        return False
    olemas_olevad_pakid.add(pakk)
    t=subprocess.run(["apt-cache", "depends", "-i", pakk], stdout=subprocess.PIPE)
    if t.stderr or t.returncode:
        print(t.stdout)
        exit(t.stderr)
    #print(":", t.stdout)
    needed_pacages=t.stdout.split(b"Depends: ")[1:]
    #print(pakk, "needs packages:", needed_pacages)
    for choices in needed_pacages:
        one_choice_made=False
        for needed_package in choices.split(b"\n"):
            needed_package=needed_package.strip(b"\n ")
            if needed_package in olemas_olevad_pakid or r(needed_package):
                one_choice_made=True
                break
        if not one_choice_made:
            print("PROBLEM: could not download any of", choices)
            return False
    return True
#for pakk in packages_to_download:
#    print("pakk:",pakk)
#    r(pakk)
r(input("package name:"))

它将下载所有依赖关系中的所有依赖关系,而不仅仅是直接依赖关系。但是安装dpkg -i *.deb失败。可能是因为apt-cache depends -i package提供了错误信息或某些some.deb文件仍需要Internet连接才能安装。


它可能会失败,因为dpkg的安装顺序不正确。您可能需要重试dpkg几次,直到安装了所有依赖项为止。
黑猫头鹰Kai
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.