Làm thế nào để chỉ cài đặt các phụ thuộc của một gói?


45

Chạy sudo apt-get install <PACKAGE>sẽ cài đặt gói, phụ thuộc của nó và bất kỳ gói được đề nghị nào khác.

Tuy nhiên, dường như không có cách nào để chỉ cài đặt các phụ thuộc của gói và loại trừ chính gói đó.

Làm thế nào một người sẽ đi về làm điều này?


Chỉ tò mò, tại sao bạn muốn làm điều này?
Kris Harper

@ root45: Vâng, đó là một tình huống độc đáo: Tôi có mã nguồn cho gói Python trong repos. và nó không bắt đầu. Tôi cần cài đặt các phụ thuộc cho gói mà không cần cài đặt gói đó (vì tôi đã có mã).
Nathan Osman

1
Bạn không thể thực hiện cài đặt apt-get một cách khô khan và xem những gì sẽ được cài đặt, sau đó chỉ cần cài đặt mọi thứ trừ ứng dụng bạn đang biên dịch?
duffydack

2
Hoặc chỉ cần cài đặt nó và sau đó gỡ bỏ ứng dụng (nhưng không phụ thuộc vào nó). Và / hoặc cài đặt một gói cập nhật / cố định sau khi xây dựng nó.
JanC

Tôi cần khả năng để làm điều này để tôi có thể xây dựng và cài đặt gói nguồn chưa được xây dựng cho kiến ​​trúc của mình. apt-get build-depcài đặt phụ thuộc xây dựng, vì vậy apt-get -b sourcehoạt động, nhưng phụ thuộc thời gian chạy không được cài đặt, vì vậy dpkg -i *.debkhông thành công.
Trevor Robinson

Câu trả lời:


24

Điều này sẽ cài đặt tất cả các gói trong trường Phụ thuộcPreDepends của gói :

sudo apt-get install $(apt-cache depends <PACKAGE> | grep Depends | sed "s/.*ends:\ //" | tr '\n' ' ')

Về cơ bản, bạn yêu cầu tất cả các phụ thuộc, lọc ra (Pre) Depends và định dạng đầu ra cho apt-get.

Một vấn đề là phụ thuộc như

Depends: pulseaudio
  pulseaudio:i386

hoặc các gói ảo như

Depends: <java6-runtime-headless>
  default-jre-headless
  openjdk-6-jre-headless

Vì vậy: sử dụng cẩn thận - nó không hoạt động trong mọi trường hợp!


1
Có rất nhiều trường hợp điều này không xử lý, ví dụ như nó sẽ hoàn toàn phá vỡ các gói ảo (được in trong dấu ngoặc nhọn). Xem ở đây ví dụ: askubuntu.com/questions/25361/...
Trevor Robinson

Cảm ơn vì gợi ý, mặc dù tôi không thực sự chắc chắn cách xử lý tất cả những vấn đề đó. :-(
htorque

2
Nếu tôi có thể, tôi muốn đề xuất giải pháp đơn giản hơn với AWK:sudo apt-get install $(apt-cache depends PACKAGE-NAME-HERE | awk '$1~/Depends/{printf $2" "}')
Sergiy Kolodyazhnyy

1
Tôi gặp vấn đề về gói ảo mà bạn đề cập ở trên; cập nhật sedtrong các đường ống để sau đây làm việc cho tôi : sed -e "s/.*ends:\ //" -e 's/<[^>]*>//'. Trong trường hợp của tôi, gói ảo < >được đi trước bởi gói thỏa mãn nó, vì vậy loại bỏ các mục trong < >hoạt động tốt.
berto

5

apt-get build-dep <package> sẽ thực hiện các mẹo.


13
Điều đó sẽ không hoạt động vì gói có phụ thuộc thời gian chạy sẽ không được cài đặt apt-get build-dep.
Nathan Osman

5

Nếu bạn không nhớ sao chép / quá khứ, chỉ cần mô phỏng cài đặt apt-get với -s. Bằng cách đó, bạn sẽ thấy các gói khác sẽ được cài đặt và / hoặc nâng cấp, sau đó bạn chỉ cần xóa tên gói bạn không muốn cài đặt từ danh sách đó và voila.

sudo apt-get install -s <package>


4

Để liệt kê tất cả các phụ thuộc của một gói nhất định không được cài đặt, bạn có thể sử dụng aptitude

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")'

Để cài đặt các phụ thuộc

aptitude search '!~i?reverse-depends("^PACKAGE_NAME$")' -F "%p" | xargs sudo apt-get install

Ví dụ

  • Liệt kê các phụ thuộc

    % aptitude search '!~i?reverse-depends("^mc$")'
    p    mc-data         - Midnight Commander - a powerful file manager -- data files
    
  • Chỉ hiển thị tên gói

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p"
    mc-data                            
    
  • Cài đặt các phụ thuộc cho, ví dụ mc

    % aptitude search '!~i?reverse-depends("^mc$")' -F "%p" | xargs sudo apt-get install     
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following NEW packages will be installed:
      mc-data
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 1.166 kB of archives.
    After this operation, 5.550 kB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu/ wily/universe mc-data all 3:4.8.13-3 [1.166 kB]
    Fetched 1.166 kB in 0s (1.250 kB/s)
    Selecting previously unselected package mc-data.
    (Reading database ... 606748 files and directories currently installed.)
    Preparing to unpack .../mc-data_3%3a4.8.13-3_all.deb ...
    Unpacking mc-data (3:4.8.13-3) ...
    Processing triggers for doc-base (0.10.6) ...
    Processing 1 added doc-base file...
    Registering documents with scrollkeeper...
    Processing triggers for man-db (2.7.4-1) ...
    Processing triggers for hicolor-icon-theme (0.15-0ubuntu1) ...
    Setting up mc-data (3:4.8.13-3) ...
    

1

Bạn có thể phân tích đầu ra của một mô phỏng cài đặt apt để làm điều này, đây là một hàm bash để làm điều đó cho bạn:

apt-install-depends() {
    local pkg="$1"
    apt-get install -s "$pkg" \
      | sed -n \
        -e "/^Inst $pkg /d" \
        -e 's/^Inst \([^ ]\+\) .*$/\1/p' \
      | xargs apt-get install
}

Sử dụng:

apt-install-depends mopidy

0

Để chỉ cài đặt phụ thuộc, bạn có thể sử dụng apt-cache show package | grep Depends. Điều này sẽ cung cấp cho bạn một danh sách các phụ thuộc:

apt-cache show apache2 | grep Depends
Depends: apache2-mpm-worker (= 2.2.22-6ubuntu5.1) | apache2-mpm-prefork (= 2.2.22-6ubuntu5.1) | apache2-mpm-event (= 2.2.22-6ubuntu5.1) | apache2-mpm-itk (= 2.2.22-6ubuntu5.1), apache2.2-common (= 2.2.22-6ubuntu5.1)

sau đó bạn có thể quyết định gói nào cài đặt với apt-get. Ngoài ra còn có aptitudetrong chế độ tương tác, bạn tìm gói chọn nó và sau đó cài đặt phụ thuộc của nó:

nhập mô tả hình ảnh ở đây

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.