Câu trả lời:
Bạn có thể sử dụng repotrack
thay vì như thế này:
repotrack -a x86_64 -p /repos/Packages [packages]
Thật không may, có một lỗi với -a
cờ (vòm). Nó sẽ tải xuống i686 và x86_64.
Đây là cách khắc phục:
if opts.arch:
#archlist = []
#archlist.extend(rpmUtils.arch.getArchList(opts.arch))
archlist = opts.arch.split(',') # Change to this
else:
archlist = rpmUtils.arch.getArchList()
Bạn có thể sử dụng repoquery
để có được danh sách các gói nhóm:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups]
Mà bạn có thể ăn vào repotrack:
repoquery --qf=%{name} -g --list --grouppkgs=all [groups] | xargs repotrack -a x86_64 -p /repos/Packages
--recursive
tùy chọn vào lệnh repoquery để làm cho nó hoạt động đệ quy.
yum-utils
dự án ngược dòng . Lý do tại sao nó tải xuống nhiều gói hơn dự kiến là vì hàm rpmUtils.arch.getArchList()
trả về tất cả các kiến trúc tương thích cho gói đã cho. Nó bao gồm ví dụ noarch
kiến trúc có thể cần thiết cho x86_64
các gói. Bạn có thể kiểm tra nguồn: yum.baseurl.org/gitweb?p=yum.git;a=blob;f=rpmUtils/ trộm
Đối với thông tin của mọi người, yumdownloader
không thực hiện công việc. Đối với bất kỳ ai có một số kinh nghiệm trong quản lý gói với `yum, việc hy vọng rằng dòng lệnh sau đây sẽ tải xuống một cách đệ quy một gói RPM và tất cả các phụ thuộc của nó:
yumdownloader --resolve <package>
Nhưng nó không. Có thể là in các phụ thuộc cấp đầu tiên hoặc các phụ thuộc chưa được cài đặt. Tôi không chắc.
Đây là một phương pháp hoạt động trên CentOS 6.5. Thực hiện theo các bước để cài đặt plugin downloadonly yum
như được đưa ra bởi Red Hat . Về cơ bản, trên CentOS 6.x, hãy:
$ sudo yum install yum-plugin-downloadonly.noarch
Sau đó, sử dụng các plugin kết hợp với --installroot
chuyển đổi yum
. Điều này ngăn không cho yum
giải quyết và sau đó bỏ qua các phụ thuộc đã được cài đặt trên hệ thống.
sudo yum install \
--installroot=</path/to/tmp_dir> \
--downloadonly --downloaddir <rpm_dir> <package>
Bạn sẽ tải xuống RPM của gói <package>
và tất cả các phụ thuộc của nó trong thư mục , <rpm_dir>
. Ví dụ, với Git:
$ mkdir root rpms
$ sudo yum install --installroot=/home/roy/root \
--downloadonly --downloaddir rpms/ git
sudo yum install yum-plugin-downloadonly.noarch
nói No package yum-plugin-downloadonly.noarch available.
phải làm gì?
yum search yumdownloader
trở lạiyum-utils.noarch
Cannot find a valid baseurl for repo: base/$releasever/x86_64
khi tôi thêm --installroot
cờ.
Cannot find a valid baseurl...
cố trên Centos 7 với giải pháp trên liên kết này : Thêm --releasever=/
tham số
Tôi nhận ra chủ đề đã cũ, nhưng trong trường hợp bất kỳ ai vấp phải điều này, bạn có thể sử dụng yum để thực hiện hành vi mong muốn.
Trước tiên, plugin downloadonly (hướng dẫn cho RHEL): (RHEL5)
$ yum install yum-downloadonly
(RHEL6)
$ yum install yum-plugin-downloadonly
Tiếp theo chạy lệnh như sau:
$ yum install --downloadonly --downloaddir=/some/arbitrary/path [package]
Nếu bạn bỏ qua --downloaddir
yum sẽ tự động tải xuống/var/cache/yum
Vì vậy, trừ khi bạn cần sử dụng yumdoader một cách cụ thể, tôi nghĩ đây sẽ là cách đơn giản nhất để hoàn thành mục tiêu.
Nếu bạn đến từ tương lai (Fedora 23+), nơi yum đang được thay thế bằng dnf, bạn có thể thấy tập lệnh bash này hữu ích.
Trình tải xuống:
#!/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
vòng / phút:
#!/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
Tôi thấy rằng trong thực tế xây dựng một repo như thế này khó duy trì. Chúng tôi xây dựng repo này vì:
Các vấn đề chúng ta có thể vượt qua là:
Cuối cùng, giải pháp tốt hơn cho vấn đề của chúng tôi là ủy quyền các repos chính thức và lưu trữ các gói chúng tôi đã sử dụng. Điều này hoạt động tốt bởi vì:
Chúng tôi đã sử dụng Nginx và hỗ trợ proxy tích hợp.
Dựa trên câu trả lời của Luke và các bình luận ...
Theo văn bản này repotrack
sẽ phù hợp với tất cả các kiến trúc sau khi x86_64
được quy định: x86_64
, athlon
, i686
, i586
, i486
, i386
, và noarch
.
Đối với mục đích của tôi tôi chỉ quan tâm đến x86_64
và noarch
bao bì, và tôi biết rằng phân phối của tôi không có bất kỳ athlon
gói.
Lệnh sau nhận danh sách các URL gói, lọc các i?86
kiến trúc và in ra tên của các gói khi chúng được tải xuống:
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'
Lưu ý rằng điều repotrack
đó không cảnh báo bạn nếu nó không thể tìm thấy gói đáp ứng sự phụ thuộc trong kho được kích hoạt của bạn. Nó âm thầm bỏ qua nó.
Cũng cố gắng
repoquery -R --resolve --recursive <name> | xargs -r yumdownloader
ví dụ:
repoquery -R --resolve --recursive firefox | xargs -r yumdownloader
--requires
--resolve
Tùy chọn của repoquery không hoạt động đệ quy cho deps.