Respostas:
Você pode usar repotrackassim:
repotrack -a x86_64 -p /repos/Packages [packages]
Infelizmente, há um erro com a -abandeira (arco). Ele fará o download do i686 e x86_64.
Veja como corrigi-lo:
if opts.arch:
#archlist = []
#archlist.extend(rpmUtils.arch.getArchList(opts.arch))
archlist = opts.arch.split(',') # Change to this
else:
archlist = rpmUtils.arch.getArchList()
Você pode usar repoquerypara obter uma lista de pacotes de grupos:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups]
Que você pode alimentar no repotrack:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
--recursiveopção ao comando repoquery para que ele funcione recursivamente.
yum-utilsprojeto upstream . A razão pela qual ele baixa mais pacotes do que o esperado é porque a função rpmUtils.arch.getArchList()retorna todas as arquiteturas compatíveis para o determinado. Inclui, por exemplo, a noarcharquitetura que pode ser necessária para os x86_64pacotes. Você pode verificar a fonte: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/...
Para informação de todos, yumdownloadernão faz o trabalho. Para qualquer pessoa com alguma experiência em gerenciamento de pacotes com `yum, é natural esperar que a seguinte linha de comando baixe recursivamente um RPM de pacote e todas as suas dependências:
yumdownloader --resolve <package>
Mas isso não acontece. Pode ser que imprima dependências de primeiro nível ou aquelas que ainda não estão instaladas. Não tenho certeza.
Aqui está um método que funciona no CentOS 6.5. Siga as etapas para instalar o plug-in downloadonly yumconforme fornecido pelo Red Hat . Basicamente, no CentOS 6.x, faça:
$ sudo yum install yum-plugin-downloadonly.noarch
Em seguida, use o plug-in em combinação com a --installrootopção de yum. Isso impede a yumresolução e o pulo das dependências já instaladas no sistema.
sudo yum install \
--installroot=</path/to/tmp_dir> \
--downloadonly --downloaddir <rpm_dir> <package>
Você faria o download dos RPMs do pacote <package>e de todas as suas dependências no diretório <rpm_dir>. Exemplo, com Git:
$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
--downloadonly --downloaddir rpms/ git
sudo yum install yum-plugin-downloadonly.noarchdiz No package yum-plugin-downloadonly.noarch available.o que fazer?
yum search yumdownloaderretornayum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64quando adiciono o --installrootsinalizador.
Cannot find a valid baseurl...problema no Centos 7 com a solução neste link : Adicione o --releasever=/parâmetro
Sei que o tópico é antigo, mas, caso alguém se depare com isso, você pode usar o yum para realizar o comportamento desejado.
Primeiro instale o plugin downloadonly (instruções para RHEL): (RHEL5)
$ yum install yum-downloadonly
(RHEL6)
$ yum install yum-plugin-downloadonly
Em seguida, execute o comando da seguinte maneira:
$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]
Se você ignorar, o --downloaddiryum será baixado automaticamente para/var/cache/yum
Portanto, a menos que você precise usar o yumdownloader especificamente, acho que essa seria a maneira mais simples de atingir o objetivo.
Se você é do futuro (Fedora 23+), onde o yum está sendo substituído pelo dnf, você pode achar esse script bash útil.
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
Descobri que, na prática, é difícil manter um repositório como esse. Criamos esse repositório porque:
Os problemas que podemos encontrar foram:
No final, a melhor solução para o nosso problema foi proxy dos repositórios oficiais e armazenar em cache os pacotes que usamos. Isso funciona bem porque:
Usamos o Nginx e o suporte a proxy incorporado.
Com base na resposta de Lucas e nos comentários ...
Como desta escrita repotrackirá corresponder a todos os seguintes arquiteturas quando x86_64é especificada: x86_64, athlon, i686, i586, i486, i386, e noarch.
Para os meus propósitos eu só estou interessado em x86_64e noarchpacotes, e eu sei que a minha distribuição não tem nenhum athlonpacotes.
O comando a seguir obtém uma lista de URLs de pacotes, filtra i?86arquiteturas e imprime os nomes dos pacotes conforme eles são baixados:
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'
Observe que repotrackele não avisa se ele não consegue encontrar um pacote que satisfaça uma dependência nos seus repositórios ativados. Ignora-o silenciosamente.
Tente também
repoquery -R --resolve --recursive <name> | xargs -r yumdownloader
por exemplo:
repoquery -R --resolve --recursive firefox | xargs -r yumdownloader
--requires--resolveopção repoquery não funciona recursivamente para deps.