在Ubuntu在本地下载包含依赖项的包
在本教程中,我们将看到如何在Ubuntu及其衍生物中下载具有依赖项的包。
使用此方法,我们可以下载.deb包以及所有必需的依赖项,而无需实际安装它。
这样我们就可以从一个系统下载包,然后在同一系统本身或者任何没有互联网连接的其他系统中安装它们。
我们还可以下载不同的架构系统的软件包。
例如,可以从64位系统下载32位包,反之亦然。
在Ubuntu在本地下载包含依赖项的包
我们可以用两种方法做到这一点。
我在Ubuntu 16.04和18.04 LTS桌面版本上测试了本教程。
它的工作正常如下所述。
方法1:
这是比下面给出的其他其他方法的最简单和直接的方法。
要在不安装它们的情况下下载包含所有依赖项的软件包,刚刚运行:
$sudo apt-get install --download-only <package_name>
例如,让我们使用命令下载包含所有必需依赖项的Vim包,而无需安装它们:
$sudo apt-get install --download-only vim
示例输出:
Reading package lists... Done Building dependency tree Reading state information... Done Suggested packages: ctags vim-doc vim-scripts The following NEW packages will be installed: vim 0 upgraded, 1 newly installed, 0 to remove and 82 not upgraded. Need to get 1,152 kB of archives. After this operation, 2,852 kB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 vim amd64 2:8.0.1453-1ubuntu1.1 [1,152 kB] Fetched 1,152 kB in 3s (372 kB/s) Download complete and in download only mode
在上面的输出中,我们已下载Vim包将所有依赖项,但我们实际上并没有安装它。
所有下载的文件都将保存在/var/cache/apt/archives目录中。
只需在任何USB上复制整个缓存文件夹,或者通过网络将它们传输到我们想要其中安装包的系统。
要安装下载的软件包,请转到缓存文件夹并安装如下所示。
$sudo dpkg -i *
看,这很简单!
但是,此方法仅适用于我们使用要下载的软件包的系统没有主包或者其本地安装的依赖项。
如果我们尝试下载已经安装在同一系统中的包,则会看到如下所示的输出。
$sudo apt-get install --download-only vim Reading package lists... Done Building dependency tree Reading state information... Done vim is already the newest version (2:8.0.1453-1ubuntu1.3). 0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.
在这种情况下,使用"apt-rdepends"下载所有包。
如果尚未安装APT-RDepends,请使用命令安装它:
$sudo apt install apt-rdepends
然后下载主包(在我们的案例中)以及使用命令的所有依赖项:
$apt download $(apt-rdepends vim | grep -v "^ ")
此命令将递归下载所有必需的软件包。
如果我们遇到如下错误的情况下:
E: Can't select candidate version from package debconf-2.0 as it has no candidate
尝试此命令:
$apt-get download $(apt-rdepends vim | grep -v "^ " | sed 's/debconf-2.0/debconf/g')
此命令将使用所有需要的包下载Vim并将其保存在当前工作目录中。
要安装所有下载的软件包,请运行:
$sudo dpkg -i *
方法2:
首先,下载我们想要下载的包的依赖关系。
要显示包的所有依赖项列表,例如python,运行:
$sudo apt-cache depends python
示例输出:
python PreDepends: python-minimal Depends: python2.7 Depends: libpython-stdlib Conflicts: <python-central> Breaks: update-manager-core Suggests: python-doc Suggests: python-tk Replaces: python-dev
让我们将Python软件包与其本地磁盘下载。
为此,请先创建一个目录来保存包。
$mkdir python
转到目录:
$cd python
然后运行:
$for i in $(apt-cache depends python | grep -E 'Depends|Recommends|Suggests' | cut -d ':' -f 2,3 | sed -e s/'<'/''/-e s/'>'/''/); do sudo apt-get download $i 2>>errors.txt; done
上面的命令将下载Python包以及所有必需的依赖项,并在当前工作目录中保存它们。
此命令还将保存错误.txt文件中的任何错误。
让我们使用'ls'命令查看下载的文件:
$ls
示例输出:
errors.txt libpython-stdlib_2.7.11-1_amd64.deb python2.7_2.7.11-7ubuntu1_amd64.deb python-doc_2.7.11-1_all.deb python-minimal_2.7.11-1_amd64.deb python-tk_2.7.11-2_amd64.deb
正如我们在上面的输出中看到的,Python包具有所有依赖项的所有依赖项都已下载。
只需将它们复制到U盘并在任何脱机系统上安装Python软件包,如下所示。
安装U盘,转到安装驱动器的位置,并运行以下命令以安装Python。
$sudo dpkg -i *
为特定架构下载具有本地依赖性的软件包
我们可能会注意到上述命令已下载64位包。
这是因为我从64位Ubuntu系统下载它们。
如果我们想下载32位拱形系统的软件包怎么办?
这也是可能的!
首先,使用命令在Ubuntu系统中启用所需的架构:
$sudo dpkg --add-architecture i386
如果不添加架构,请尝试下载包时会收到以下错误消息。
E: No packages found
启用我们选择的架构后,运行以下命令以下载特定的体系结构相关包。
$for i in $(apt-cache depends python:i386 | grep -E 'Depends|Recommends|Suggests' | cut -d ':' -f 2,3 | sed -e s/'<'/''/-e s/'>'/''/); do sudo apt-get download $i 2>>errors.txt; done
正如我们在上面的输出中看到的那样,我已经使用'apt-cache'命令添加了架构'i386'。
示例输出:
Get:1 http://in.archive.ubuntu.com/ubuntu xenial/main i386 python-minimal i386 2.7.11-1 [28.2 kB] Fetched 28.2 kB in 1s (25.8 kB/s) Get:1 http://in.archive.ubuntu.com/ubuntu xenial/main i386 python2.7 i386 2.7.11-7ubuntu1 [220 kB] Fetched 220 kB in 1s (116 kB/s) Get:1 http://in.archive.ubuntu.com/ubuntu xenial/main i386 libpython-stdlib i386 2.7.11-1 [7,664 B] Fetched 7,664 B in 0s (13.3 kB/s) Get:1 http://in.archive.ubuntu.com/ubuntu xenial/main i386 python-tk i386 2.7.11-2 [28.0 kB] Fetched 28.0 kB in 1s (24.8 kB/s)
让我们检查下载的包。
$ls
示例输出:
errors.txt libpython-stdlib_2.7.11-1_i386.deb python2.7_2.7.11-7ubuntu1_i386.deb python-minimal_2.7.11-1_i386.deb python-tk_2.7.11-2_i386.deb
看?
上面的命令仅下载了32位包。
我们现在知道如何在Ubuntu系统中下载包含依赖关系的包。
此方法对于所有基于DEB的系统相同。