Unduh semua dependensi dengan yumdownloader, bahkan jika sudah diinstal?

34

Apakah ada cara untuk mengunduh semua dependensi dengan yumdownloader, walaupun sudah diinstal?

Saya mencoba membuat repo lokal dan hanya ingin memasukkan paket yang kami butuhkan.

Luke
sumber

Jawaban:

29

Anda dapat gunakan repotrack seperti ini:

repotrack -a x86_64 -p /repos/Packages [packages]

Sayangnya ada bug dengan -aflag (lengkungan). Ini akan mengunduh i686 dan x86_64.

Berikut cara memperbaikinya:

if opts.arch:
    #archlist = []
    #archlist.extend(rpmUtils.arch.getArchList(opts.arch))
    archlist = opts.arch.split(',') # Change to this
else:
    archlist = rpmUtils.arch.getArchList()

Anda dapat menggunakan repoqueryuntuk mendapatkan daftar paket grup:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups]

Yang bisa Anda masukkan ke mereprack:

repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
Luke
sumber
Diperbarui untuk menggunakan mereprack sebagai gantinya. Opsi repoquery --requires --resolvetidak bekerja secara rekursif untuk deps.
Lukas
tambahkan --recursiveopsi ke perintah repoquery untuk membuatnya bekerja secara rekursif.
ZaSter
Memperbaiki mereprack dengan cara yang disarankan di atas tidak berhasil untuk saya: tidak ada paket yang diunduh untuk arch x86_64. Pokoknya +1 untuk tip yang bagus: dengan mereprack satu orang bisa mengunduh i386 dan x86_64 dan menyaring bagian yang tidak perlu.
Alexander Vasiljev
@ Lukas bagaimana cara menggunakan fix part ... berarti di mana untuk mengeksekusi jika syaratnya disebutkan ... dan bagaimana jika saya perlu memeriksa hanya paket tertentu dalam perintah repoquery.
AVJ
2
Saya tidak akan merekomendasikan untuk mengubah kode sumber. Jika benar, ini adalah bug, itu harus dimasukkan ke yum-utilsproyek hulu . Alasan mengapa ia mengunduh lebih banyak paket dari yang diharapkan adalah karena fungsi rpmUtils.arch.getArchList()mengembalikan semua arsitektur yang kompatibel untuk yang diberikan. Ini termasuk misalnya noarcharsitektur yang mungkin dibutuhkan oleh x86_64paket. Anda dapat memeriksa sumbernya: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/…
Samuel Phan
18

Untuk informasi semua orang, yumdownloaderjangan lakukan pekerjaan itu. Bagi siapa pun yang memiliki pengalaman dalam manajemen paket dengan `yum, adalah wajar untuk mengharapkan bahwa perintah-baris berikut akan mengunduh RPM paket dan semua ketergantungannya secara rekursif:

yumdownloader --resolve <package>

Tapi ternyata tidak. Mungkin itu mencetak dependensi tingkat pertama atau yang belum diinstal. Saya tidak yakin.

Berikut adalah salah satu metode yang bekerja pada CentOS 6.5. Ikuti langkah-langkah untuk menginstal plugin unduh hanya yumseperti yang diberikan oleh Red Hat . Pada dasarnya, pada CentOS 6.x, lakukan:

$ sudo yum install yum-plugin-downloadonly.noarch

Kemudian gunakan plugin dalam kombinasi dengan --installrootsakelar yum. Ini mencegah yumdari menyelesaikan dan kemudian melewatkan dependensi yang sudah diinstal pada sistem.

sudo yum install \
  --installroot=</path/to/tmp_dir> \
  --downloadonly --downloaddir <rpm_dir> <package>

Anda akan mengunduh RPM paket, <package>dan semua dependensinya di direktori <rpm_dir>,. Contoh, dengan Git:

$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
  --downloadonly --downloaddir rpms/ git
pdp
sumber
Bagaimana Anda membalikkan proses ini dan menginstal paket daun menggunakan dependensi lokal?
bias
centos65 sudo yum install yum-plugin-downloadonly.noarchmengatakan No package yum-plugin-downloadonly.noarch available.apa yang harus dilakukan?
Howard Lee
@HowardLee Running yum search yumdownloaderkembaliyum-utils.noarch
Ali
5
Saya mendapatkan kesalahan ini Cannot find a valid baseurl for repo: base/$releasever/x86_64ketika saya menambahkan --installrootbendera.
Mike S
Menyingkirkan Cannot find a valid baseurl...masalah pada Centos 7 dengan solusi pada tautan ini : Tambahkan --releasever=/parameter
Chirlo
2

Saya menyadari utasnya sudah tua, tetapi jika ada orang yang menemukan ini, Anda dapat menggunakan yum untuk menyelesaikan perilaku yang diinginkan.

Pertama instal plugin unduh saja (instruksi untuk RHEL): (RHEL5)

$ yum install yum-downloadonly

(RHEL6)

$ yum install yum-plugin-downloadonly

Selanjutnya jalankan perintah sebagai berikut:

$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]

Jika Anda mengabaikan --downloaddir yum akan secara otomatis diunduh ke/var/cache/yum

Jadi kecuali Anda perlu menggunakan yumdownloader secara khusus, saya pikir ini akan menjadi cara paling sederhana untuk mencapai tujuan.

SudoMakeMeAS dan yang
sumber
4
Ini masih menjadi masalah jika paket sudah diinstal
Zack S
2

Jika Anda dari masa depan (Fedora 23+), di mana yum diganti dengan dnf, Anda mungkin menemukan skrip bash ini bermanfaat.

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
Adam Kurkiewicz
sumber
9
Apakah ini masa depan?
kirkpatt
1

Saya menemukan bahwa dalam praktek membangun repo seperti ini sulit untuk dipertahankan. Kami membangun repo ini karena:

  • Kami ingin menarik paket dari sumber lokal untuk beberapa server.
  • Hanya izinkan paket tepercaya diinstal.

Masalah yang bisa kami temui adalah:

  • Menjaga paket tetap terbaru. Ketergantungan berubah. Beberapa ditambahkan, yang lain dihapus.
  • Menambahkan paket baru yang ingin kami instal.
  • Tantangan di atas memperpanjang proses mendorong pembaruan kritis.

Pada akhirnya solusi yang lebih baik untuk masalah kami adalah dengan mem-proxy repo resmi dan menyimpan paket yang kami gunakan. Ini bekerja dengan baik karena:

  • Hanya paket yang kami gunakan yang disimpan secara lokal.
  • Paket lama otomatis kedaluwarsa.
  • Ketika suatu paket digunakan pertama kali, ia menarik dari repo resmi, tetapi permintaan berikutnya datang dari cache.
  • Memercayai repo resmi sudah cukup untuk kepercayaan. Mirror proxy kami hanya menarik paket dari sumber tepercaya.

Kami menggunakan Nginx dan dukungan proxy bawaan.

Luke
sumber
Proxy nginx terdengar seperti ide bagus. Dukungan jangka panjang yang lebih baik dan mengambil lebih banyak paket. Akan sangat membantu jika Anda menambahkan sedikit detail, mungkin cara menautkan atau sesuatu
oden
0

Membangun jawaban Luke dan komentarnya ...

Pada tulisan ini repotrackakan cocok dengan semua arsitektur berikut ketika x86_64ditentukan: x86_64, athlon, i686, i586, i486, i386, dan noarch.

Untuk tujuan saya, saya hanya tertarik pada x86_64dan noarchpaket, dan saya tahu bahwa distribusi saya tidak memiliki athlonpaket.

Perintah berikut mendapatkan daftar URL paket, memfilter i?86arsitektur, dan mencetak nama paket saat diunduh:

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'

Catatan yang repotracktidak memperingatkan Anda jika tidak dapat menemukan paket yang memenuhi ketergantungan pada repo Anda yang diaktifkan. Diam-diam melewatkannya.

M. Dudley
sumber