2013-08-07 38 views
12

Tôi có một số ứng dụng python bao gồm các tập lệnh/mô-đun cần được đóng gói và triển khai dưới dạng RPM.Phân phối gói python cùng với các phụ thuộc mô-đun bằng cách sử dụng RPM

Bit khó hơn là mỗi ứng dụng phải được phân phối cùng với tất cả các phụ thuộc của mô-đun python và chúng nên được sử dụng tùy theo bất kỳ hệ thống nào được cài đặt rộng.

Máy chủ mục tiêu cho một số RPM này có quyền truy cập mạng bị hạn chế, do đó, RPM phải chứa mọi thứ cần thiết để chạy ứng dụng, thay vì tải xuống bất kỳ thứ gì vào thời gian triển khai.

Tôi đã xem xét đóng gói và phân phối virtualenv, nhưng việc chuyển vị trí virtualenv dường như không được hỗ trợ tốt.

Tôi đã xem zc.buildout nhưng đã tìm thấy tài liệu bị thiếu. Tôi có thể xem cách tải xuống các phụ thuộc trong quá trình phát triển, chứ không phải cách phân phối chúng như là một phần của ứng dụng lớn hơn. Có thể các ứng dụng khác nhau yêu cầu các phiên bản khác nhau của cùng một mô-đun, vì vậy chúng không nên được cài đặt rộng rãi.

Điểm đau khác là bất kỳ tập lệnh python nào trong ứng dụng cần được sửa đổi để sử dụng sys.path khác trong khi phát triển và sau khi triển khai, tôi không thể thấy rõ ràng về điều này.

Các đề xuất về cách tốt nhất để đạt được điều này? Một bản tóm tắt lý tưởng của công việc này từ quan điểm của nhà phát triển sẽ như thế nào:

  1. nguồn tải về ứng dụng
  2. chạy kịch bản để lấy phụ thuộc module cụ thể nếu không có mặt (có lẽ sử dụng pip)
  3. chạy kịch bản để xây dựng ứng dụng python và gói nó cũng như tất cả các phụ thuộc đã tải xuống vào RPM

RPM cuối cùng sẽ có thể cài đặt và chạy trên máy chủ không có quyền truy cập mạng và chỉ cài đặt trình thông dịch python.

+1

Bạn có thể phân phối một python độc lập có thể thực thi - được đóng gói trong RPM? Bạn có cần mã nguồn của mình để có sẵn cho người dùng không? Nếu không nhìn ở đây http://stackoverflow.com/questions/5458048/how-to-make-a-python-script-standalone-executable-to-run-without-any-dependency – Anshul

+1

Tôi đã không sử dụng nó, nhưng [conda] (http://www.continuum.io/blog/conda) nhằm mục đích xử lý các trường hợp như của bạn. Hãy xem phần "Phát gói của riêng bạn" tại liên kết này. –

+0

Bạn nên sử dụng pip pip hoặc pip "wheel wheel" – ionelmc

Trả lời

1

Tôi muốn xem đó là hai vấn đề riêng biệt.

  1. Bạn muốn có một cài đặt/xây dựng hệ thống lặp lại cho các nhà phát triển của bạn.

  2. Bạn muốn trình tạo trình cài đặt.

Xây dựng (hoặc pip, có lẽ kết hợp với tập lệnh phụ) có thể giải quyết vấn đề đầu tiên. Về cơ bản: "làm thế nào để có được dự án đã sẵn sàng để phát triển trên một máy tính xách tay tươi". Lý tưởng nhất là bạn chỉ cần nói python bootstrap.py;bin/buildout và sẵn sàng (cùng với pip/virtualenv).

Bây giờ bạn có bản dựng lặp lại, bạn có thể sử dụng làm cơ sở cho trình cài đặt. Handiest là một máy ảo sạch mà bạn chỉ sử dụng cho mục đích này. Ví dụ: Virtualbox/vagrant. Tạo các kịch bản cài đặt VirtualBox và cài đặt các phụ thuộc thích hợp trong đó.

Tập lệnh trình xây dựng trình cài đặt sau đó có thể thực hiện thanh toán mới dự án của bạn bên trong hộp ảo và thực hiện điều chỉnh lại có thể lặp lại ở vị trí bạn muốn có trong trình cài đặt (ví dụ: /opt/yourproject).

Sau đó, sử dụng FPM để tạo gói thực tế (.deb, .rpm, bất kỳ thứ gì). Vượt qua các tùy chọn FPM để nói về các phụ thuộc cần thiết, bằng cách này bạn luôn có thể chắc chắn rằng các phụ thuộc đó được cài đặt. (Lưu ý: đây là các phụ thuộc cấp hệ điều hành như memcached hoặc postgres; các phụ thuộc python nên được xử lý bằng pip hoặc buildout).

Nếu bạn chia nhỏ vấn đề lớn của mình trong hai vấn đề nhỏ hơn này, cả hai có thể bị tấn công riêng.

+1

Một vấn đề với FPM là các gói khác nhau (bạn muốn cài đặt) có thể có các phụ thuộc khác nhau (ví dụ: một gói yêu cầu 1.6 và các yêu cầu khác 2.1, v.v.) không thể diễn tả những khác biệt này, bởi vì FPM sẽ đóng gói một gói python đơn lẻ là RPM và cài đặt nó (trên toàn cầu, để nói). Do đó, tốt hơn là nên cài đặt một dự án python và các phụ thuộc của nó như một RPM đơn lẻ, như [rpmvenv] (https://github.com/kevinconway/rpmvenv). – miku

Các vấn đề liên quan