1

Я пытаюсь загрузить некоторые пакеты для автономной установки, используя 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 . Как мне это сделать?

3 ответа3

1

Поскольку apt-rdepends не предоставляет способ игнорировать пакеты, для удаления пакетов, которые не могут быть удовлетворены из списка загрузки, необходима оболочка. Относительно переносимый способ автоматизировать это без необходимости сначала устанавливать интерпретатор, такой как Perl/Python, - это использовать приведенный ниже скрипт BASH.

getdepends.sh:

 #!/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 здесь:

http://pastebin.com/kj2evSt7

0

Я только что столкнулся с похожей проблемой с 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')

Это сработало для меня.

0

Может быть, эта процедура будет работать для вас. Но операционные системы на исходном и целевом компьютерах должны быть максимально одинаковыми.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .