Bagaimana paket Debian menginstal modul Python dari PyPI

20

Pertanyaan ini mencoba melengkapi yang satu ini . Saya memiliki aplikasi python yang menggunakan modul pihak ketiga dari PyPI. Saya ingin mengemas aplikasi saya menjadi paket debian, tetapi tidak tahu bagaimana menangani dependensi python yang tidak dalam repositori debian / ubuntu (dikemas sebagai paket debian juga)

Solusi # 1:
bangun modul dari PyPI langsung ke paket debian saya.

Solusi # 2:
buat paket debian untuk semua modul PyPI yang saya perlukan menggunakan stdeb dan menambahkannya ke repositori debian / ubuntu.

Saya sebenarnya membutuhkan Solusi # 3 karena saya ingin menginstal dependensi PyPI ketika saya menginstal paket debian saya, lebih disukai ke dalam virtualenv!

Apa yang akan menjadi Solusi # 3 ? Apakah saya perlu mengubah skrip DEBIAN / preinst maintainer?

andri_ch
sumber
Bisakah Anda menjelaskan mengapa Anda perlu membuat paket Debian? Apakah aplikasi Python Anda membutuhkan sumber daya non-Python?
Jonathan
@ Jonathan Saya ingin pengguna dapat menginstal aplikasi saya dari Ubuntu Software Center. Saya pikir saya perlu *. Deb untuk itu. Aplikasi Python saya tidak perlu sumber daya non-Python, hanya modul python pihak ketiga.
andri_ch
Paket @Jonathan Debian adalah metode instalasi standar di Ubuntu. Seseorang dapat dengan mudah mendistribusikan .debfile, atau mengatur repositori pribadi, atau PPA di Launchpad.
MestreLion

Jawaban:

20

Saya telah berbicara dengan beberapa pengelola di saluran IRC Debian irc: //irc.debian.org#debian-mentors , menanyakan hal yang persis sama, dan konsensus umum adalah:

Solusi # 1:

Mengintegrasikan dependensi dalam paket Anda dengan menyalin file sumber mereka sebagai basis kode tunggal sangat disukai. Itu akan mengalahkan tujuan dari sistem pengemasan yang menangani dependensi, pembaruan, versi, dll.

Solusi # 3:

Mengunduh paket non-debian dengan cepat saat memasang biner ( .deb) adalah risiko keamanan yang serius , jelas tidak boleh. Anda bahkan tidak akan dapat memeriksa dependensi dengan mengekstraksi deb, karena mereka diunduh dan diinstal pada waktu instalasi. Ini adalah pendekatan yang sepenuhnya memotong sistem repositori. Tidak ada pengguna yang peduli akan senang dengan paket yang, di belakang layar (dan seperti root, ingat!), Mengunduh perangkat lunak tidak terpercaya tambahan dari sumber yang tidak terpercaya. Ya, itu akan membutuhkan mengutak-atik DEBIAN/postinst(atau preinst) dan mengeluarkan wget(atau, dalam kasus Anda,pip install), dan itulah pendekatan yang diambil oleh Flash, Oracle Java, Steam dan lainnya. Tapi itu adalah perangkat lunak berpemilik, sumber tertutup, jadi keamanan mereka tidak ada.

Solusi # 1.5:

Anda tidak menyebutkan hal itu, tapi Anda bisa mengintegrasikan dependensi hanya pada waktu pembangunan , yakni di sumber paket (yang .orig.tar.gz, .debian.tar.gz, .dsctriad), dengan men-download dari PyPI saat membuat "biner" paket (yang .deb). Instruksi untuk pip installakan masuk debian/rules(perhatikan huruf kecil debian, yang bertentangan dengan paket biner), dan akan dieksekusi ketika Anda mengeluarkan debuildatau dpkg-buildpackage.

Ini adalah jalan tengah antara # 1 dan # 3. Ini mengurangi (tetapi tidak menyelesaikan!) Beberapa masalah # 3: setidaknya Anda dapat memeriksa produk akhir, dan .debtidak akan memerlukan akses internet pada waktu pemasangan. Semua risiko dan beban ditransfer dari pengguna akhir ke pengelola paket. Tetapi, memiliki masalah yang sama dengan # 1, karena memotong sebagian besar infrastruktur sistem pengemasan. Afterall, penanganan dependensi (Versi, update, persyaratan, konflik) adalah mengapa dpkg/ aptdiciptakan di tempat pertama! :)

Solusi # 2:

The One True Right Way ™ . Anda membuat paket debian untuk dependensi Anda, daftar mereka sebagai persyaratan dalam paket Anda, dan mengirimkan semua .debspaket sumber atau.

Dari sana, Anda memiliki sejumlah opsi:

  • Kirimkan paket sumber, baik perangkat lunak Anda dan dependensinya, untuk dimasukkan ke Debian. Jika diterima, mereka akan secara otomatis tersedia untuk semua pengguna Debian, termasuk semua turunan seperti Ubuntu.

  • Unggah paket sumber ke Launchpad , sehingga menciptakan PPA yang dapat dengan mudah ditambahkan dan diinstal oleh pengguna Ubuntu (dan turunannya seperti Linux Mint)

  • Host repositori debian Anda sendiri di situs web Anda, yang dapat ditambahkan oleh pengguna dari sistem berbasis Debian apa pun /etc/apt/sources.list.ddan gunakan aptinfrastruktur untuk mengunduh, menginstal, dan terus memperbarui, (seperti di atas!)

  • Host .debfile untuk unduh dan instal langsung. Tidak ada aptatau pembaruan otomatis yang terlibat dipikirkan.

Adapun cara mengemas dependensi PyPi Anda (dan perangkat lunak python Anda juga!), Ada sejumlah alat dan referensi yang membuat prosesnya mudah:

  • stdeb , seperti yang Anda sebutkan. Oldie dan goodie.

  • Pybuild , alat baru dan luar biasa dari Debian yang menggantikan stdeb.

Dan banyak referensi bermanfaat:

Butuh bantuan? Lihat itu:

MestreLion
sumber
2

Saya pikir Anda hanya perlu menambahkan kode baris perintah yang relevan ke skrip postinst dalam paket .deb. Ditemukan dalam jawaban ini , lebih detail di panduan debian resmi .

TheSchwa
sumber
2

Ada pypi2debuntuk mendapatkan paket dari pypi dan membuatnya menjadi paket deb.

LtWorf
sumber
0

Mereka tidak, seperti cpan di perl, jika Anda memiliki dalam repositori, Anda dapat menginstal dengan apt-get, jika tidak Anda dapat menginstal dengan pip, perbedaannya adalah instalasi pip di / usr / local.

Untuk menginstal dengan pip Anda dapat melakukan:

apt-get install python-pip 
pip install foopackage 

sebagai contoh:

pip install MultipartPostHandler2
Sérgio
sumber
Ini tidak menjawab pertanyaan OP. Pertanyaannya adalah bagaimana membuat paket Debian menginstal paket Python dari PyPi sehingga 'apt-get <custom-package>' atau 'dpkg -i <custom-package>' akan menarik dependensi python dari PyPi.
SevakPrime
Mereka tidak, seperti cpan di perl, jika Anda memiliki di repositori, Anda dapat menginstal dengan apt-get, jika tidak Anda dapat menginstal dengan pip, perbedaannya adalah pip menginstal di / usr / local, tetapi mungkin itu akan lebih baik hapus jawaban saya.
Sérgio
Komentar Anda memberikan jawaban yang sesuai untuk pertanyaan OP. Anda harus memasukkan komentar itu dalam jawaban Anda untuk dipilih. (Misalnya, lihat jawaban MestreLion.) Seperti, jawaban Anda tidak menjawab pertanyaan OP.
SevakPrime