我正在尝试下载一些软件包以进行离线安装,apt-get download
但由于某种原因,apt-rdepends
其中包含不存在的软件包。这是我正在使用的命令:
apt-get download $(apt-rdepends libboost1.55-all-dev | grep -v "^ ")
这是我得到的输出:
E: Can't select candidate version from package libstdc++-dev as it has no candidate
E: Can't select candidate version from package debconf-2.0 as it has no candidate
E: Can't select candidate version from package libc-dev as it has no candidate
E: Can't select candidate version from package python-celementtree as it has no candidate
E: Can't select candidate version from package python-elementtree as it has no candidate
但apt
一直抱怨说有些包没有候选。我想忽略这些错误并下载包及其依赖项。我似乎找不到可以让我忽略错误的标志apt-get
。我该怎么做?
答案1
由于apt-rdepends
没有提供忽略软件包的方法,因此需要一个包装器来从下载列表中删除无法满足要求的软件包。一种相对便携的自动化方法是使用下面的 BASH 脚本,而无需先安装 Perl/Python 等解释器。
获取依赖项:
#!/bin/bash
export MAXPARAMETERS=255
function array_contains_find_index() {
local n=$#
local i=0
local value=${!n}
for (( i=1; i < n; i++ )) {
if [ "${!i}" == "${value}" ]; then
echo "REMOVING $i: ${!i} = ${value}"
return $i
fi
}
return $MAXPARAMETERS
}
LIST=( $( apt-rdepends $1 | grep -v "^ " ) )
echo ${LIST[*]}
read -n1 -r -p "... Packages that will be downloaded (Continue or CTRL+C) ..."
RESULTS=( $( apt-get download ${LIST[*]} |& cut -d' ' -f 8 ) )
LISTLEN=${#LIST[@]}
while [ ${#RESULTS[@]} -gt 0 ]; do
for (( i=0; i < $LISTLEN; i++ )); do
array_contains_find_index ${RESULTS[@]} ${LIST[$i]}
ret=$?
if (( $ret != $MAXPARAMETERS )); then
unset LIST[$i]
fi
done
FULLRESULTS=$( apt-get download ${LIST[*]} 2>&1 )
RESULTS=( $( echo $FULLRESULTS |& cut -d' ' -f 11 | sed -r "s/'(.*?):(.*$)/\1/g" ) )
done
apt-get download ${LIST[*]}
运行脚本:
./getdepends.sh [package name]
我编写的带有更多日志记录功能的注释版本可在 pastebin 上找到:
答案2
linux-image-4.13.0-16-generic
我刚刚在 artful 上遇到了类似的问题:apt-get download $(apt-rdepends linux-image-4.13.0-16-generic | grep -v "^ ")
抱怨没有debconf-2.0
。您可以找出哪些软件包提供了此功能:https://packages.ubuntu.com/artful/debconf-2.0。例如,它由debconf
包提供。然后你可以使用以下命令修复上述问题:
apt-get download $(apt-rdepends linux-image-4.13.0-16-generic | grep -v "^ " | sed 's/debconf-2.0/debconf/g')
这对我有用。
答案3
这个过程可能对你有用。但源计算机和目标计算机的操作系统应尽可能相同。
1)在源计算机上的某个位置创建下载文件的临时文件夹并输入:
source_comp# mkdir libboost
source_comp# cd libboost
2)获取安装所需包的 http 地址列表:
source_comp# apt-get -y --print-uris install libboost1.55-all-dev | grep "'" | cut -f1 -d' ' | tr -d "'" > packet-list.txt
4)获取构建所需的附加包的列表:
source_comp# apt-get -s build-dep libboost1.55-all-dev | grep "^ " > build-dep.txt
5)获取这些包的http地址列表:
source_comp# apt-get -y --print-uris install `cat build-dep.txt` | cut -f1 -d' ' | tr -d "'" | sort | uniq > build-dep-urls.txt
6)下载所有软件包
source_comp# wget --input-file packet-list.txt
source_comp# wget --input-file build-dep-urls.txt
7) 将源计算机上此文件夹中的所有 deb 文件复制到目标计算机上 apt 档案的默认文件夹(例如,使用 scp):
target_comp# scp user@source_comp:/path_to_libboost/*.deb /var/cache/apt/archives/
并忽略警告和错误来更新本地缓存存储库:
target_comp# apt-get update
8)现在您需要安装构建数据包的所有基础设施:
target_comp# apt-get build-dep libboost1.55-all-dev
9)最后是数据包本身:
target_comp# apt-get install libboost1.55-all-dev