Odpowiedzi:
Możesz użyć repotrack
zamiast tego w następujący sposób:
repotrack -a x86_64 -p /repos/Packages [packages]
Niestety wystąpił błąd z -a
flagą (łukiem). Pobierze i686 i x86_64.
Oto jak to naprawić:
if opts.arch:
#archlist = []
#archlist.extend(rpmUtils.arch.getArchList(opts.arch))
archlist = opts.arch.split(',') # Change to this
else:
archlist = rpmUtils.arch.getArchList()
Możesz użyć, repoquery
aby uzyskać listę pakietów grupowych:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups]
Które możesz dodać do repotrack:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
--recursive
opcję do polecenia repoquery, aby rekurencyjnie działała.
yum-utils
projektu nadrzędnego . Powodem, dla którego pobiera więcej pakietów niż oczekiwano, jest to, że funkcja rpmUtils.arch.getArchList()
zwraca wszystkie kompatybilne architektury dla danego. Obejmuje na przykład noarch
architekturę, która może być potrzebna x86_64
pakietom. Możesz sprawdzić źródło: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Dla informacji wszystkich yumdownloader
nie wykonuje pracy. Dla każdego, kto ma pewne doświadczenie w zarządzaniu pakietami z `yum, naturalne jest oczekiwanie, że następujący wiersz poleceń pobierze rekurencyjnie pakiet RPM i wszystkie jego zależności:
yumdownloader --resolve <package>
Ale tak nie jest. Może to być drukowanie zależności pierwszego poziomu lub tych, które nie są jeszcze zainstalowane. Nie jestem pewien.
Oto jedna metoda, która działa na CentOS 6.5. Postępuj zgodnie z instrukcjami, aby zainstalować wtyczkę downloadonly dla yum
podaną przez Red Hat . Zasadniczo na CentOS 6.x:
$ sudo yum install yum-plugin-downloadonly.noarch
Następnie skorzystaj z wtyczki w połączeniu z --installroot
przełącznikiem yum
. Zapobiega to yum
rozwiązywaniu, a następnie pomijaniu zależności, które są już zainstalowane w systemie.
sudo yum install \
--installroot=</path/to/tmp_dir> \
--downloadonly --downloaddir <rpm_dir> <package>
Można by pobrać RPM pakietu, <package>
a wszystkie jego zależności w katalogu <rpm_dir>
. Przykład z Git:
$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
--downloadonly --downloaddir rpms/ git
sudo yum install yum-plugin-downloadonly.noarch
mówi, No package yum-plugin-downloadonly.noarch available.
co robić?
yum search yumdownloader
zwracayum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64
pojawia się po dodaniu --installroot
flagi.
Cannot find a valid baseurl...
problemu z Centos 7 dzięki rozwiązaniu pod tym linkiem : Dodaj --releasever=/
parametr
Zdaję sobie sprawę, że wątek jest stary, ale na wypadek, gdyby ktoś natknął się na to, możesz użyć yum, aby osiągnąć pożądane zachowanie.
Najpierw instynktownie plugin do pobrania (instrukcje dla RHEL): (RHEL5)
$ yum install yum-downloadonly
(RHEL6)
$ yum install yum-plugin-downloadonly
Następnie uruchom polecenie w następujący sposób:
$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]
Jeśli zignorujesz, --downloaddir
yum automatycznie pobierze do/var/cache/yum
Więc chyba, że musisz specjalnie używać yumdownloadera, myślę, że byłby to najprostszy sposób na osiągnięcie celu.
Jeśli jesteś z przyszłości (Fedora 23+), gdzie yum zastępuje się dnf, ten skrypt bash może ci się przydać.
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
rpm Resolver:
#!/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
Odkryłem, że w praktyce budowanie takiego repozytorium jest trudne do utrzymania. Zbudowaliśmy to repozytorium, ponieważ:
Problemy, które możemy rozwiązać, to:
Ostatecznie lepszym rozwiązaniem naszego problemu było proxy oficjalnych repozytoriów i buforowanie używanych pakietów. Działa to dobrze, ponieważ:
Użyliśmy Nginx i wbudowanej obsługi proxy.
Opierając się na odpowiedzi Luke'a i komentarzach ...
W chwili pisania tego repotrack
będzie pasował do wszystkich następujących architektur gdy x86_64
jest określona: x86_64
, athlon
, i686
, i586
, i486
, i386
, i noarch
.
Dla moich celów Jestem zainteresowany tylko x86_64
i noarch
opakowań, a wiem, że moja dystrybucja nie ma żadnych athlon
pakietów.
Następujące polecenie pobiera listę adresów URL pakietów, odfiltrowuje i?86
architektury i drukuje nazwy pakietów podczas pobierania:
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'
Pamiętaj, że repotrack
nie ostrzega cię, jeśli nie może znaleźć pakietu, który spełnia zależność w twoich włączonych repozytoriach. Po cichu to pomija.
Spróbuj także
repoquery -R --resolve --recursive <name> | xargs -r yumdownloader
na przykład:
repoquery -R --resolve --recursive firefox | xargs -r yumdownloader
--requires
--resolve
opcja repoquery nie działa rekurencyjnie dla deps.