Respostas:
Você pode usar repotrack
assim:
repotrack -a x86_64 -p /repos/Packages [packages]
Infelizmente, há um erro com a -a
bandeira (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 repoquery
para 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
--recursive
opção ao comando repoquery para que ele funcione recursivamente.
yum-utils
projeto 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 noarch
arquitetura que pode ser necessária para os x86_64
pacotes. Você pode verificar a fonte: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/...
Para informação de todos, yumdownloader
nã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 yum
conforme 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 --installroot
opção de yum
. Isso impede a yum
resoluçã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.noarch
diz No package yum-plugin-downloadonly.noarch available.
o que fazer?
yum search yumdownloader
retornayum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64
quando adiciono o --installroot
sinalizador.
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 --downloaddir
yum 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 repotrack
irá 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_64
e noarch
pacotes, e eu sei que a minha distribuição não tem nenhum athlon
pacotes.
O comando a seguir obtém uma lista de URLs de pacotes, filtra i?86
arquiteturas 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 repotrack
ele 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
--resolve
opção repoquery não funciona recursivamente para deps.