Làm cách nào để kiểm tra danh sách phụ thuộc cho gói gỡ lỗi


94

Làm thế nào tôi có thể kiểm tra danh sách phụ thuộc cho gói deb. Tôi đang chạy Ubuntu 11.10 và tôi đã sao lưu tất cả các gói gỡ lỗi từ var/cache/apt/archives. Tôi muốn định dạng máy tính của mình và chỉ cài đặt lại các ứng dụng đã chọn. Ngoài ra làm thế nào tôi có thể nhận được danh sách các gói và phụ thuộc được cài đặt.


Đối với câu hỏi thứ hai của bạn, hãy xem Askubfox.com/questions/17823/ từ
htorque

Để biết danh sách đầy đủ các gói đã cài đặt, hãy sử dụngdpkg --get-selections | sed -n 's/[[:space:]]install$//p'
Tino

Câu trả lời:


73

Ngoài dpkgphương thức, bạn có thể kiểm tra sự phụ thuộc của các gói trong kho lưu trữ:

apt-cache depends package-name

EDIT Cập nhật với khuyến nghị của @ Tino. Nhận xét của @ Tigran không còn áp dụng.


3
Lưu ý: điều này chỉ hoạt động nếu gói đã được cài đặt.
Tigran Saluev

@TigranSaluev Lưu ý rằng dpkg -I packagechỉ hoạt động đối với các gói đã cài đặt. apt-cachehoạt động cho tất cả các gói được biết đến sau khi bạn đã thực hiện apt-get update.
Tino

1
apt-cache depends packagelà một cách tốt hơn, trong trường hợp đó, vì showpkgkhông biết liệu một phụ thuộc có phải là một khuyến nghị, xung đột, v.v., vì vậy nó có một chút khó hiểu. Đối với tập lệnh được dependskết hợp với showpkgxem unix.stackexchange.com/a/362866/23450
Tino

100

Điều này sẽ cho bạn thấy tất cả các thông tin về gói:

dpkg -I package.deb

Điều đó không còn hoạt động trên Ubuntu 14.04:dpkg -I splunkforwarder-6.3.3-f44afce176d0-linux-2.6-amd64.deb new debian package, version 2.0. size 15881308 bytes: control archive=3104 bytes. 153 bytes, 5 lines control 6058 bytes, 207 lines * postinst #!/bin/bash 2912 bytes, 93 lines * preinst #!/bin/bash Package: splunkforwarder Version: 6.3.3 Maintainer: Splunk Inc. <info@splunk.com> Architecture: amd64 Description: Splunk The platform for machine data.
Craig S. Anderson

@ CraigS.Anderson Chạy 14.04 ở đây và nó hoạt động hoàn hảo trong trường hợp của tôi. Nên là câu trả lời được chấp nhận IMHO.
magic_al

Đừng quên đặt /var/cache/apt/archives/trước tên gói và sử dụng hoàn thành tab để tìm tên gói đầy đủ với phiên bản, vd dpkg -I /var/cache/apt/archives/elasticsearch_2.4.4_all.deb.
Jason R. Coombs

1
Tôi không thấy bất kỳ thông tin phụ thuộc nào
Nick

Bạn có thể thêm rằng gói có thể được lấy mà không cần (cài đặt lại) (có thể là trường hợp sử dụng phổ biến) với sudo apt-get install --reinstall --download-only [package name].
Karl Richter

2

apt-cache depends [Package-Name]cũng sẽ làm việc Mặc dù nếu bạn lấy .debgói từ bên ngoài danh sách nguồn của mình, những thứ như apt-cache showpkg [Package-Name] && apt-cache depends [Package-Name]có thể hiển thị thông tin lỗi thời hoặc có thể không đồng bộ với gói được cài đặt thực tế do đó dpkg -I [Package-Name]sẽ hoạt động tốt nhất trong trường hợp đó.


2

Từ 14.04 trở đi:

dpkgkhông còn -Inữa và bạn phải sử dụng dpkg-debđể hiển thị thông tin gói bao gồm cả phụ thuộc:

dpkg-deb -I package.deb

1
Xin chào Fabby, dpkg hiện không có tùy chọn -I. Đã thử nghiệm trên Ubuntu 12.04 và 16.04. Bạn phải sử dụng dpkg-deb thay thế.
Rup Naraya

Nhận xét rút lại; câu trả lời được làm rõ và nâng cao
Fabby

0

Đây là một số cẩu thả và có thể không bao gồm quá trình xử lý hậu kỳ mà bạn có thể làm để dpkg -Ixuất ra để lấy các mục phụ thuộc dưới dạng danh sách:

Ngưng tụ cho máy tính

# dpkg -I package.deb | python -c "import sys, re; t=re.split(r'\n(?= ?[\w]+:)|:', sys.stdin.read()); print '\n'.join([i.strip() for i in {key.strip(): value.strip() for key, value in zip(t[::2], t[1::2])}['Depends'].split(',')])"
#

Mở rộng cho con người:

dpkg -I package.deb | python -c "
    import sys, re;
    # Split keys and values into pairs (zipped together later)
    t=re.split(
        r'\n(?= ?[\w]+:)|:', 
        sys.stdin.read()
    ); 
    # Newline separate each dependency
    print '\n'.join([
        # Trim each dependency value
        i.strip() for i in {
            # Build assoc array from package metadata
            key.strip(): value.strip() 
            for key, value in zip(t[::2], t[1::2])
        }['Depends'].split(',')
    ])
"

Điều này sẽ lặp lại các gói phụ thuộc vào 'foo.deb' và chưa được cài đặt: dpkg -I foo.deb | với i bằng $ (awk -F ',' '/ Depends: / {gsub (/: /, ","); for (i = 2; i <= NF; i ++) {gsub (/. * $ /, "", $ (i)); printf ("% s \ n", $ (i));}} '); làm dpkg -s $ i &> / dev / null | | tiếng vang $ i; xong | tr '\ n' ''
Gregory Burd

@GregoryBurd, Hãy thoải mái chỉnh sửa câu trả lời của tôi / psot tất cả những gì bạn thích, tôi đã đăng nó dưới dạng wiki cộng đồng vì lý do này ^ u ^
ThorSummoner

Khi tôi chạy lệnh này trên elaticsearch, nó sẽ phát ra libc6\nadduser\n Installed-Size\n. Đó là, nó dường như phù hợp với nhiều hơn chỉ là dòng Phụ thuộc.
Jason R. Coombs

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.