Liệt kê các gói trong Yum phụ thuộc vào gói đã cài đặt khác


48

Tôi đang cố gắng cài đặt gói RPM của bên thứ 3 trên RHEL5, tùy thuộc vào phiên bản 3.4 của sqlite. Theo Yum tôi đã cài đặt 3.3.6.

Có cách nào để liệt kê các gói đã cài đặt phụ thuộc vào sqlite 3.3.6 không?

Câu trả lời:


47

Tùy chọn vòng / phút bạn muốn là:

rpm -q --whatrequires sqlite

Đã chỉnh sửa: đã thêm - được cài đặt cho mỗi cuộc thảo luận trong các câu trả lời / nhận xét khác

Đã chỉnh sửa: đã xóa - đã cài đặt vì đây là tùy chọn không hợp lệ cho vòng / phút


3
Hơn nữa, repoquerycó thể được sử dụng để tạo một cây đẹp như cấu trúc của tất cả các gói yêu cầu một gói cụ thể, ví dụ:repoquery --pkgnarrow=installed --tree-whatrequires sqlite
pdp

3
Tôi không đồng ý rằng câu trả lời này là đáng tin cậy - chắc chắn không phải trên CentOS 7.x. Để kiểm tra, cài đặt ImageMagick. OpenEXR-libs cũng sẽ được cài đặt vì ImageMagick phụ thuộc vào nó. Bây giờ hãy chạy vòng / phút - yêu cầu OpenEXR-libs và trả về là "không có gói nào yêu cầu OpenEXR-libs" là INCORRECT. Bây giờ hãy chạy "repoquery -q --installed --whatrequires OpenEXR-libs" và nó trả về chính xác "ImageMagick-0: 6.7.8.9-15.el7_2.x86_64". @just câu trả lời ngẫu nhiên của một chàng trai dưới đây nên là câu trả lời chính xác ở đây.
Pancho

6
--installedlà một tùy chọn cho repoquerynhưng không hợp lệ cho rpm.
Dan Rice

36

Câu trả lời

repoquery -q --installed --whatrequires sqlite

Giải thích

rpm -q --whatrequires sqlite chỉ báo cáo phụ thuộc vào tên gói.

Ngược lại, repoqueryhoạt động như sau (từ manpages):

   --alldeps
          When used with --whatrequires, look for non-explicit dependencies in addition to explicit ones (e.g. files and Provides  in  addition  to  package  names).
          This is the default.

Thí dụ

Hãy lấy gói libdb.

# rpm -q --whatrequires libdb
no package requires libdb

Không có gói nào phụ thuộc vào libdb, vì vậy chúng tôi sẽ có thể loại bỏ nó một cách trơn tru. Tuy nhiên...

# yum remove -y libdb
Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package libdb.x86_64 0:5.3.21-19.el7 will be erased
--> Processing Dependency: libdb(x86-64) = 5.3.21-19.el7 for package: libdb-utils-5.3.21-19.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: pam-1.1.8-12.el7_1.1.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-libs-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: libdb-utils-5.3.21-19.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: cyrus-sasl-lib-2.1.26-20.el7_2.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-python-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: python-libs-2.7.5-39.el7_2.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-devel-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: 2:postfix-2.10.1-6.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: rpm-build-libs-4.11.3-17.el7.x86_64
--> Processing Dependency: libdb-5.3.so()(64bit) for package: iproute-3.10.0-54.el7_2.1.x86_64
--> Running transaction check
. . .
. . .
. . .
Error: Trying to remove "systemd", which is protected
Error: Trying to remove "yum", which is protected

Như bạn có thể thấy một số gói khác không phụ thuộc trực tiếp vào gói, mà là tệp libdb-5.3.so()(64bit)do nó cung cấp.

Cuối cùng, đây là danh sách thực sự của các gói tùy thuộc vào libdb:

# repoquery -q --installed --whatrequires libdb
cyrus-sasl-lib-0:2.1.26-20.el7_2.x86_64
iproute-0:3.10.0-54.el7_2.1.x86_64
libdb-utils-0:5.3.21-19.el7.x86_64
pam-0:1.1.8-12.el7_1.1.x86_64
postfix-2:2.10.1-6.el7.x86_64
python-libs-0:2.7.5-39.el7_2.x86_64
rpm-0:4.11.3-17.el7.x86_64
rpm-build-libs-0:4.11.3-17.el7.x86_64
rpm-devel-0:4.11.3-17.el7.x86_64
rpm-libs-0:4.11.3-17.el7.x86_64
rpm-python-0:4.11.3-17.el7.x86_64

1
Câu trả lời này tốt hơn câu trả lời được chấp nhận
Pancho

11

Đối với dnf (phiên bản mới của yum), bạn có thể thử với lệnh trình bao bọc repoquery:

dnf repoquery --whatrequires sqlite

Nếu nó không có sẵn, bạn có thể cài đặt nó bằng lệnh:

dnf -y install dnf-plugins-core

Bạn cần --installed --recursiveở cuối vì vậy nó chỉ trả về những gì đang thực sự được cài đặt và không kéo từ các kho
Hashbrown


3

Tôi nghĩ điều bạn thực sự muốn biết là "các gói yêu cầu sqlite-3.3.6 là gì, nhưng sẽ không hài lòng với sqlite-3.4.z" ... và cách tốt nhất để tìm ra điều đó, là thử nó. Như:

echo | yum upgrade sqlite

1

Như Wes Hardaker đã nói , một phương pháp tích hợp tốt là sử dụng rpm -q --whatrequires <package>. Vấn đề là, rpmhoạt động dựa trên các khả năng cho độ phân giải phụ thuộc, không chỉ đơn giản là trên các gói, ví dụ như dpkgtrong phân phối Linux của Debian / Ubuntu. Như những người khác đã lưu ý, chỉ đơn giản là rpm -q --whatrequires sqlitekhông làm cho toàn bộ câu chuyện, do đó một số gợi ý sử dụng repoquery. repoquerytuy nhiên, không được cài đặt theo mặc định trong tối thiểu RHEL / CentOS 7 (có thể cả máy tính để bàn?), vì vậy nó có thể không có sẵn cho tất cả mọi người.

Người dùng có thể làm rpm -q --provides <pkgname>để xem tất cả các khả năng mà gói cung cấp, sau đó sử dụng rpm -q --whatrequires <capability>để xem các gói đã cài đặt yêu cầu khả năng đó. Thông tin này có thể được truy vấn ngắn gọn bằng cách sử dụng một lớp lót BASH (được phân tách ở đây thành hai dòng cho chiều dài):

capabilities=($(rpm -q --provides sqlite | awk -F= '{print $1}'));
for c in "${capabilities[@]}"; do rpm -q --whatrequires "$c"; done

Điều này chỉ sử dụng các tùy chọn tích hợp sẵn cho rpmchính nó và do đó, nó không yêu cầu cài đặt bất kỳ gói bổ sung nào (ví dụ: yum-utilstrong CentOS 7, là gói có chứa repoquery).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.