Ответы:
Вы можете использовать repotrack
вместо этого, как это:
repotrack -a x86_64 -p /repos/Packages [packages]
К сожалению, есть ошибка с -a
флагом (арка). Он загрузит i686 и x86_64.
Вот как это исправить:
if opts.arch:
#archlist = []
#archlist.extend(rpmUtils.arch.getArchList(opts.arch))
archlist = opts.arch.split(',') # Change to this
else:
archlist = rpmUtils.arch.getArchList()
Вы можете использовать, repoquery
чтобы получить список групповых пакетов:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups]
Который вы можете кормить в repotrack:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
--recursive
опцию в команду repoquery, чтобы она работала рекурсивно.
yum-utils
проект. Причина, по которой она загружает больше пакетов, чем ожидалось, заключается в том, что функция rpmUtils.arch.getArchList()
возвращает все совместимые архитектуры для данной. Он включает в себя, например, noarch
архитектуру, которая может понадобиться x86_64
пакетам. Вы можете проверить источник: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Для всеобщего сведения, yumdownloader
не делает работу. Для любого, кто имеет некоторый опыт управления пакетами с помощью `yum, естественно ожидать, что следующая командная строка будет рекурсивно загружать RPM пакета и все его зависимости:
yumdownloader --resolve <package>
Но это не так. Может быть, он печатает зависимости первого уровня или те, которые еще не установлены. Я не уверен.
Вот один метод, который работает на CentOS 6.5. Выполните следующие действия , чтобы установить плагин для downloadonly yum
как дано Red Hat . В основном на CentOS 6.x выполните:
$ sudo yum install yum-plugin-downloadonly.noarch
Затем используйте плагин в сочетании с --installroot
переключателем yum
. Это предотвращает yum
разрешение и последующее пропускание зависимостей, которые уже установлены в системе.
sudo yum install \
--installroot=</path/to/tmp_dir> \
--downloadonly --downloaddir <rpm_dir> <package>
Вы бы скачали RPM пакета <package>
и все его зависимости в каталоге <rpm_dir>
. Пример с Git:
$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
--downloadonly --downloaddir rpms/ git
sudo yum install yum-plugin-downloadonly.noarch
говорит No package yum-plugin-downloadonly.noarch available.
что делать?
yum search yumdownloader
возвращаетсяyum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64
когда добавляю --installroot
флаг.
Cannot find a valid baseurl...
проблемы на Centos 7 с помощью решения по этой ссылке : Добавьте --releasever=/
параметр
Я понимаю, что поток старый, но в случае, если кто-то наткнется на это, вы можете использовать yum для достижения желаемого поведения.
Сначала плагин downloadonly (инструкция для RHEL): (RHEL5)
$ yum install yum-downloadonly
(RHEL6)
$ yum install yum-plugin-downloadonly
Далее выполните команду следующим образом:
$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]
Если вы проигнорируете, --downloaddir
yum автоматически загрузится в/var/cache/yum
Поэтому, если вам не нужно специально использовать yumdownloader, я думаю, что это будет самый простой способ достичь цели.
Если вы из будущего (Fedora 23+), где yum заменяется на dnf, этот скрипт bash может оказаться полезным.
rpmDownloader:
#!/bin/sh
set -xev
rm -fr packages
#dnf download $1 --destdir packages
export PATH=.:$PATH
echo $PWD
DEPS=$(rpmResolver $1)
dnf download $DEPS --destdir packages
rm -fr ${1}-dependencies
mv packages ${1}-dependencies
rpmResolver:
#!/bin/sh
goal=$1
deps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $goal | egrep -v '^(rpmlib|rtld|config|/)')
goals=
while true; do
subs=$(rpm -q --qf '%{NAME}\n' --whatprovides $deps | sort -u | tr '\n' ' ')
if [ ."$subs" = ."$goals" ]; then
echo -n "$goals "
exit 0
fi
goals=$(echo $goals $subs | tr ' ' '\n' | sort -u | tr '\n' ' ')
for sub in $subs; do
subdeps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $sub | egrep -v '^(rpmlib|rtld|config|/)')
deps=$(echo $deps $subdeps | sort -u)
done
done
Я обнаружил, что на практике создание такого репо сложно поддерживать. Мы создали этот репо, потому что:
Проблемы, с которыми мы могли столкнуться, были:
В конце концов, лучшим решением нашей проблемы было прокси официальных репозиториев и кеширование пакетов, которые мы использовали. Это хорошо работает, потому что:
Мы использовали Nginx и встроенную поддержку прокси.
Опираясь на ответ Люка и комментарии ...
На это письмо repotrack
будет соответствовать всем из следующих архитектур , когда x86_64
указано: x86_64
, athlon
, i686
, i586
, i486
, i386
, и noarch
.
Для моих целей меня интересуют только пакеты x86_64
и noarch
пакеты, и я знаю, что в моем дистрибутиве нет athlon
пакетов.
Следующая команда получает список URL-адресов пакетов, отфильтровывает i?86
архитектуры и распечатывает имена пакетов по мере их загрузки:
repotrack --arch=x86_64 --urls gs1000-server \
| sed '/\.i[3-6]86\.rpm$/d' \
| xargs -I {} sh -c 'curl -s -O {}; echo {} | rev | cut -d '/' -f 1 | rev'
Обратите внимание, что repotrack
это не предупреждает вас, если он не может найти пакет, который удовлетворяет зависимости в ваших включенных репозиториях. Он молча пропускает это.
Также попробуйте
repoquery -R --resolve --recursive <name> | xargs -r yumdownloader
например:
repoquery -R --resolve --recursive firefox | xargs -r yumdownloader
--requires
--resolve
не работает рекурсивно для deps.