Saya menggunakan pip dengan virtualenv untuk mengemas dan menginstal beberapa pustaka Python.
Saya membayangkan apa yang saya lakukan adalah skenario yang cukup umum. Saya adalah pengelola beberapa pustaka yang dependensinya dapat saya tentukan secara eksplisit. Beberapa perpustakaan saya bergantung pada perpustakaan pihak ketiga yang memiliki ketergantungan transitif yang tidak dapat saya kendalikan.
Apa yang saya coba capai adalah pip install
salah satu perpustakaan saya mengunduh / menginstal semua dependensi upstreamnya. Apa yang saya perjuangkan dalam dokumentasi pip adalah jika / bagaimana file persyaratan dapat melakukan ini sendiri atau jika mereka benar-benar hanya pelengkap untuk digunakan install_requires
.
Apakah saya akan menggunakan install_requires
di semua pustaka saya untuk menentukan dependensi dan rentang versi, lalu hanya menggunakan file persyaratan untuk menyelesaikan konflik dan / atau membekukannya untuk build produksi?
Anggap saja saya hidup di dunia imajiner (saya tahu, saya tahu) dan ketergantungan hulu saya langsung dan dijamin tidak akan pernah bertentangan atau merusak kompatibilitas ke belakang. Apakah saya akan dipaksa untuk menggunakan file persyaratan pip sama sekali atau biarkan pip / setuptools / distribusikan menginstal semuanya berdasarkan install_requires
?
Ada banyak pertanyaan serupa di sini, tetapi saya tidak dapat menemukan pertanyaan yang mendasar seperti kapan harus menggunakan satu atau yang lain atau menggunakan keduanya bersama-sama secara harmonis.
sumber
Jawaban:
Filosofi saya adalah itu
install_requires
harus menunjukkan minimal apa yang Anda butuhkan. Ini mungkin termasuk persyaratan versi jika Anda tahu bahwa beberapa versi tidak akan berfungsi; tetapi seharusnya tidak memiliki persyaratan versi di mana Anda tidak yakin (misalnya, Anda tidak yakin apakah rilis dependensi di masa mendatang akan merusak perpustakaan Anda atau tidak).Persyaratan file di sisi lain harus menunjukkan apa yang Anda tahu tidak bekerja, dan mungkin termasuk dependensi opsional yang Anda rekomendasikan. Misalnya Anda mungkin menggunakan SQLAlchemy tetapi menyarankan MySQL, dan letakkan MySQLdb di file persyaratan).
Jadi, ringkasannya:
install_requires
adalah menjauhkan orang dari hal-hal yang Anda tahu tidak berfungsi, sementara file persyaratan untuk mengarahkan orang ke hal-hal yang Anda tahu berhasil. Salah satu alasannya adalahinstall_requires
persyaratan selalu dicentang, dan tidak dapat dinonaktifkan tanpa benar-benar mengubah metadata paket. Jadi, Anda tidak dapat dengan mudah mencoba kombinasi baru. File persyaratan hanya diperiksa pada saat penginstalan.sumber
setup.py
install_requires=
depsrequirements.txt
?-U
karena itu mungkin menimpa dependensi dari file persyaratan? Bagaimana Anda meningkatkan?inilah yang saya masukkan ke setup.py saya:
# this grabs the requirements from requirements.txt REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()] setup( ..... install_requires=REQUIREMENTS )
sumber
--extra-index-url
dalam persyaratan diperlukan dan ini meledak di wajah saya. Terima kasih @RomainHardinPanduan Pengguna Kemasan Python memiliki halaman tentang topik ini, saya sangat menyarankan Anda membacanya:
Ringkasan:
install_requires
ada di sana untuk membuat daftar dependensi dari paket yang mutlak harus diinstal agar paket dapat bekerja. Ini tidak dimaksudkan untuk menyematkan dependensi ke versi tertentu, tetapi rentang diterima, misalnyainstall_requires=['django>=1.8']
.install_requires
diamati olehpip install name-on-pypi
dan alat lainnya.requirements.txt
hanyalah file teks, yang dapat Anda pilih untuk dijalankanpip install -r requirements.txt
. Ini dimaksudkan untuk memiliki versi dari semua dependensi dan subdependencies disematkan, seperti ini:django==1.8.1
. Anda dapat membuatnya menggunakanpip freeze > requirements.txt
. (Beberapa layanan, seperti Heroku, berjalan secara otomatispip install -r requirements.txt
untuk Anda.)pip install name-on-pypi
Tidak melihatrequirements.txt
, hanya padainstall_requires
.sumber
Saya hanya pernah menggunakan
setup.py
daninstall_requires
karena hanya ada satu tempat untuk dilihat. Ini sama kuatnya dengan memiliki file persyaratan dan tidak ada duplikasi untuk dipertahankan.sumber