Làm thế nào để tải xuống gói .deb và tất cả các phụ thuộc?


14

Đối với tất cả các câu trả lời tôi tìm thấy về chủ đề này, giải pháp là tạo ra, trong một máy tính nhất định A nơi tôi cần cài đặt gói, một tệp chứa tất cả các phụ thuộc mà nó cần và sau đó tải xuống trong một máy tính khác, hãy gọi nó là B.

Vấn đề là, tôi muốn có một bộ lưu trữ phần mềm quan trọng nhất định mà tôi cần phải làm việc để có thể cài đặt chúng ngoại tuyến sau này trong trường hợp tôi phải định dạng máy tính để bàn của mình.

Tôi thực sự không chăm sóc về việc có nhiều tệp .deb dư thừa trong máy tính của mình và tôi THỰC SỰ KHÔNG CẨN THẬN nếu tôi sẽ lưu trữ 1gb tệp để cài đặt phần mềm 10mb.

Vì vậy, tôi muốn có bất kỳ phụ thuộc có thể tải về. Có cách nào đó tôi có thể làm điều này?


Câu trả lời:


22

Tôi sẽ đi với điều này:

apt-get download PACKAGE && apt-cache depends -i PACKAGE | awk '/Depends:/ {print $2}' | xargs apt-get download

Sau đó, bạn có thể cài đặt nó dpkg -i *.debtrong thư mục bạn đã tải xuống.


1
Tôi nghĩ rằng nó đã làm việc, cảm ơn bạn rất nhiều. Tôi sẽ chỉ kiểm tra nó thêm một chút nữa trước khi tôi quay lại để cảm ơn bạn một lần nữa :)
ebernardes 11/215

Bạn có thể giải thích cho tôi các lệnh awk và xargs làm gì không? Tôi mới bắt đầu sử dụng linux và tôi chưa bao giờ thấy 2 lệnh này trước đây
ebernardes 11/215

apt-cache depends -isẽ kiểm tra các phụ thuộc quan trọng cho GÓI. Nó sẽ chỉ được thực hiện nếu apt-get download PACKAGEsẽ thành công trong việc tìm GÓI trong kho ppa mà bạn đã thêm vào /etc/apt/sources.list. Bây giờ, apt-cache depends -i PACKAGEcó đầu ra của hình thức Depends: dependency-name. Chúng ta chỉ cần tên của các phụ thuộc, vì vậy đó là những gì awk đang làm - nó chỉ nhận được chuỗi thứ hai. Ví dụ, hãy thử làm apt-cache depends -i vim | awk '{print $2}' . Cũng lưu ý, toàn bộ dòng bên phải của && có thể được coi là một tuyên bố
Sergiy Kolodyazhnyy

1
Cảm ơn! Nhưng tôi đã thực hiện một số nghiên cứu và tôi đã sử dụng lệnh sed '/ ^ </ d' để xóa một số đầu ra của apt-cache, nó đã tốt, nhưng bây giờ nó hoạt động trong mọi trường hợp tôi đang thử. Cảm ơn rất nhiều!
ebernardes

dpkg -i *.debkhông tốt lắm, nó không cài đặt gói theo thứ tự phụ thuộc. Vì vậy, bạn có thể cần thử lại nhiều lần để cài đặt tất cả các gói. Dù sao để giải quyết?
Mithril

1

Đây có phải là một lần, hoặc một cái gì đó bạn muốn tiếp tục cập nhật? Bạn chủ yếu làm việc trực tuyến và chỉ muốn một bản sao lưu cục bộ của tất cả các gói của bạn, chỉ trong trường hợp?

Có một số dịch vụ mà bạn có thể cài đặt hoạt động như một proxy / bộ đệm APT. Bạn trỏ APT vào bộ đệm cục bộ của mình, nó sẽ tải xuống từ Internet và giữ một bản sao được lưu trong bộ nhớ cache cục bộ của tất cả các gói. Điều này có thể rất hữu ích nếu bạn có nhiều máy tính trên mạng với lựa chọn gói giống hệt nhau.

Bộ đệm apt ưa thích của tôi là xấp xỉ , nhưng cũng có apt-cacher-ng, và một vài cái khác. Mỗi cái có sự khác biệt nhỏ về cách bộ nhớ đệm có thể được cấu hình.

Tôi luôn sử dụng các trình cài đặt netinst tối thiểu để xây dựng các hệ thống dựa trên Debian của mình, điều đó có nghĩa là bộ đệm apt của tôi thường có hầu hết các gói để xây dựng đầy đủ các hệ thống của tôi.


Đây là thứ tôi muốn giữ trong trường hợp, nếu tôi cần nhanh chóng cài đặt một số phần mềm, ngay cả khi đó là phiên bản lỗi thời, trước khi tôi có thể cập nhật nó sau. Tôi sẽ kiểm tra xem, cảm ơn :)
ebernardes

0

chạy chương trình python sau:

import subprocess
package=input("insert package name:")
t=subprocess.run(["apt-cache", "depends", "-i", package], stdout=subprocess.PIPE)
if t.stderr or t.returncode:
    print(t.stdout)
    exit(t.stderr)
#print(":", t.stdout)
needed_pacages=t.stdout.split(b"Depends: ")
print(package, "depends of", needed_pacages)
for choices in needed_pacages:
    one_choice_made=False
    for needed_package in choices.split(b"\n"):
        needed_package=needed_package.strip(b"\n ")
        t=subprocess.run(["apt-get", "download", needed_package])
        if t.stderr or t.returncode:
            print("ERROR: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "package name:", needed_package)
        else:
            one_choice_made = True
            #print("downloaded",vajalik_pakk)
            break
    if not one_choice_made:
        print("could not get one of dependecies", choices)

1
Và tại sao điều này tốt hơn câu trả lời được chấp nhận?
RalfFriedl

0

chạy chương trình python3 sau:

import subprocess
olemas_olevad_pakid=set()
def r(pakk):
    t=subprocess.run(["apt-get", "download", pakk])
    if t.stderr or t.returncode:
        #print("could not load package: Status: {p.returncode}, stdout: {p.stdout}, stderr: {p.stderr}".format(p=t), "paki nimi:", pakk)
        return False
    olemas_olevad_pakid.add(pakk)
    t=subprocess.run(["apt-cache", "depends", "-i", pakk], stdout=subprocess.PIPE)
    if t.stderr or t.returncode:
        print(t.stdout)
        exit(t.stderr)
    #print(":", t.stdout)
    needed_pacages=t.stdout.split(b"Depends: ")[1:]
    #print(pakk, "needs packages:", needed_pacages)
    for choices in needed_pacages:
        one_choice_made=False
        for needed_package in choices.split(b"\n"):
            needed_package=needed_package.strip(b"\n ")
            if needed_package in olemas_olevad_pakid or r(needed_package):
                one_choice_made=True
                break
        if not one_choice_made:
            print("PROBLEM: could not download any of", choices)
            return False
    return True
#for pakk in packages_to_download:
#    print("pakk:",pakk)
#    r(pakk)
r(input("package name:"))

Nó sẽ tải xuống tất cả các phụ thuộc của tất cả các phụ thuộc không chỉ phụ thuộc ngay lập tức. Nhưng cài đặt chúng dpkg -i *.debkhông thành công. Có thể do apt-cache depends -i packagecung cấp thông tin sai hoặc một số tệp.d.deb vẫn cần kết nối internet để cài đặt.


Nó có thể thất bại vì dpkg không cài đặt các gói theo đúng thứ tự. Bạn có thể muốn thử lại dpkg một vài lần cho đến khi tất cả các phụ thuộc được cài đặt.
Black Owl Kai
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.