Gói Debian có thể cài đặt các mô-đun Python từ PyPI như thế nào


20

Câu hỏi này cố gắng bổ sung cho câu hỏi này . Tôi có một ứng dụng python sử dụng các mô-đun của bên thứ ba từ PyPI. Tôi muốn gói ứng dụng của mình thành gói debian, nhưng không biết cách xử lý các phụ thuộc python không có trong kho debian / ub Ubuntu (cũng được đóng gói dưới dạng gói debian)

Giải pháp số 1:
xây dựng các mô-đun từ PyPI ngay vào gói debian của tôi.

Giải pháp # 2:
tạo các gói debian cho tất cả các mô-đun PyPI tôi cần bằng cách sử dụng stdeb và thêm chúng vào kho lưu trữ debian / ub Ubuntu.

Tôi thực sự cần một Giải pháp số 3 vì tôi muốn cài đặt các phụ thuộc PyPI khi tôi cài đặt gói debian của mình, tốt nhất là vào một virtualenv!

Giải pháp số 3 sẽ là gì? Tôi có cần phải điều chỉnh tập lệnh duy trì DEBIAN / preinst không?


Bạn có thể mô tả lý do tại sao bạn cần tạo một gói Debian? Ứng dụng Python của bạn có cần tài nguyên không phải Python không?
Jonathan

@Jonathan Tôi muốn người dùng có thể cài đặt ứng dụng của tôi từ Trung tâm phần mềm Ubuntu. Tôi nghĩ rằng tôi cần một * .deb cho điều đó. Ứng dụng Python của tôi không cần tài nguyên không phải Python, chỉ cần các mô-đun python của bên thứ ba.
andri_ch

Các gói Debian @Jonathan là phương pháp cài đặt tiêu chuẩn trong Ubuntu. Người ta có thể dễ dàng phân phối .debtệp hoặc thiết lập kho lưu trữ riêng hoặc PPA trong Launchpad.
MestreLion

Câu trả lời:


20

Tôi đã nói chuyện với một số người bảo trì tại kênh Debian IRC irc: //irc.debian.org#debian-mentors , yêu cầu điều tương tự chính xác và sự đồng thuận chung là:

Giải pháp số 1:

Việc tích hợp các phụ thuộc trong gói của bạn bằng cách sao chép các tệp nguồn của chúng dưới dạng một cơ sở mã duy nhất rất khó chịu. Nó sẽ đánh bại mục đích của một hệ thống đóng gói xử lý các phụ thuộc, cập nhật, phiên bản, v.v.

Giải pháp số 3:

Tải xuống các gói không phải là debian khi đang cài đặt nhị phân ( .deb) là một rủi ro bảo mật nghiêm trọng , chắc chắn là không. Bạn thậm chí sẽ không thể kiểm tra các phụ thuộc bằng cách giải nén deb, bởi vì chúng được tải xuống và cài đặt khi cài đặt. Đó là một cách tiếp cận hoàn toàn bỏ qua hệ thống kho lưu trữ. Không người dùng nào quan tâm sẽ hài lòng với một gói, đằng sau hậu trường (và như root, hãy nhớ!), Tải xuống phần mềm không đáng tin cậy bổ sung từ các nguồn không đáng tin cậy. Có, điều đó sẽ yêu cầu đấu tranh với DEBIAN/postinst(hoặc preinst) và ban hành wget(hoặc, trong trường hợp của bạn,pip install) và đó là cách tiếp cận được thực hiện bởi Flash, Oracle Java, Steam và những người khác. Nhưng đó là phần mềm độc quyền, nguồn đóng, vì vậy bảo mật của họ là không có.

Giải pháp số 1.5:

Bạn đã không đề cập đến nó, nhưng bạn có thể tích hợp các phụ thuộc duy nhất vào thời gian xây dựng , ví dụ, trong nguồn gói (các .orig.tar.gz, .debian.tar.gz, .dscbộ ba), bằng cách tải về từ PyPi khi tạo "nhị phân" gói (các .deb). Các hướng dẫn cho pip installsẽ đi vào debian/rules(chú ý chữ thường debian, trái ngược với gói nhị phân) và sẽ được thực thi khi bạn phát hành debuildhoặc dpkg-buildpackage.

Đây là một trung gian giữa # 1 và # 3. Nó giảm nhẹ (nhưng không giải quyết được!) Một số vấn đề của # 3: ít nhất bạn có thể kiểm tra sản phẩm cuối cùng và .debsẽ không yêu cầu truy cập internet khi cài đặt. Tất cả các rủi ro và gánh nặng được chuyển từ người dùng cuối cùng sang người duy trì gói. Nhưng, có những vấn đề tương tự như # 1, vì nó bỏ qua hầu hết các cơ sở hạ tầng hệ thống đóng gói. Sau tất cả, xử lý các phụ thuộc (phiên bản, cập nhật, yêu cầu, xung đột) là lý do tại sao dpkg/ aptđược tạo ra ngay từ đầu! :)

Giải pháp số 2:

Các One True Way Right ™ . Bạn tạo các gói debian cho các phụ thuộc của mình, liệt kê chúng theo yêu cầu trong gói của bạn và gửi tất cả các .debsgói hoặc gói nguồn.

Từ đó, bạn có một số tùy chọn:

  • Gửi các gói nguồn, cả phần mềm của bạn và phần phụ thuộc của nó, để đưa vào Debian. Nếu được chấp nhận, chúng sẽ tự động có sẵn cho tất cả người dùng Debian, bao gồm tất cả các công cụ phái sinh như Ubuntu.

  • Tải các gói nguồn lên Launchpad , do đó tạo PPA mà bất kỳ người dùng Ubuntu nào (và các dẫn xuất của nó như Linux Mint) có thể dễ dàng thêm và cài đặt

  • Lưu trữ kho lưu trữ debian của riêng bạn trong trang web của bạn, rằng người dùng từ bất kỳ hệ thống dựa trên Debian nào cũng có thể thêm vào /etc/apt/sources.list.dvà sử dụng aptcơ sở hạ tầng để tải xuống, cài đặt và tiếp tục cập nhật, (như ở trên!)

  • Lưu trữ các .debtập tin để tải về và cài đặt trực tiếp. Không có apthoặc cập nhật tự động liên quan đến suy nghĩ.

Về cách đóng gói các phụ thuộc PyPi của bạn (và cả phần mềm python của bạn nữa!), Có một số công cụ và tài liệu tham khảo giúp cho quy trình trở nên dễ dàng:

  • stdeb , như bạn đã đề cập. Oldie và goodie.

  • Pybuild , một công cụ mới, tuyệt vời của Debian thay thế stdeb.

Và nhiều tài liệu tham khảo hữu ích:

Cần giúp đỡ? Kiểm tra xem:



2

pypi2debđể có được một gói từ pypi và biến nó thành một gói deb.


0

Chúng không giống như cpan trong perl, nếu bạn có trong kho, bạn có thể cài đặt bằng apt-get, nếu không bạn có thể cài đặt bằng pip, sự khác biệt sẽ là cài đặt pip trong / usr / local.

Để cài đặt với pip bạn có thể làm:

apt-get install python-pip 
pip install foopackage 

ví dụ:

pip install MultipartPostHandler2

Điều này không trả lời câu hỏi của OP. Câu hỏi đặt ra là làm thế nào để gói Debian cài đặt gói Python từ PyPi sao cho 'apt-get <custom-pack>' hoặc 'dpkg -i <custom-pack>' sẽ kéo phụ thuộc python từ PyPi.
SevakPrime

Chúng không giống như cpan trong perl, nếu bạn có trong kho, bạn có thể cài đặt bằng apt-get, nếu không bạn có thể cài đặt bằng pip, thì sự khác biệt sẽ là cài đặt pip trong / usr / local, nhưng có lẽ nó sẽ tốt hơn nên xóa câu trả lời của tôi.
Sérgio

Nhận xét của bạn cung cấp một câu trả lời thích hợp cho câu hỏi của OP. Bạn nên đặt bình luận đó trong câu trả lời của bạn để được bình chọn. (Ví dụ: xem câu trả lời của MestreLion.) Như vậy, câu trả lời của bạn không trả lời câu hỏi của OP.
SevakPrime
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.