Saya mulai bekerja dengan Python. I've ditambahkan requirements.txt
dan setup.py
untuk proyek saya. Tapi, saya masih bingung tentang tujuan dari kedua file. Saya telah membaca bahwa setup.py
ini dirancang untuk redistributable dan hal-hal yang requirements.txt
ini dirancang untuk non-redistributable hal. Tapi saya tidak yakin ini adalah akurat.
Bagaimana dua file yang benar-benar dimaksudkan untuk digunakan?
requirements.txt
Ini membantu anda untuk mengatur lingkungan pengembangan anda. Program-program seperti pip
dapat digunakan untuk menginstal semua paket yang tercantum dalam file dalam satu gerakan. Setelah itu anda dapat mulai mengembangkan script python. Terutama berguna jika anda berencana untuk memiliki orang lain memberikan kontribusi terhadap perkembangan atau menggunakan lingkungan virtual.
Ini adalah bagaimana anda menggunakannya:
pip install -r < requirements.txt
setup.py
Hal ini memungkinkan anda untuk membuat paket-paket yang anda dapat mendistribusikan. Script ini dimaksudkan untuk menginstal paket anda pada pengguna akhir's sistem, bukan untuk mempersiapkan pengembangan lingkungan sebagai pip install-r < requirements.txt
tidak.
Lihat jawaban ini untuk rincian lebih lanjut tentang setup.py.
Dependensi dari proyek anda terdaftar di kedua file.
Jawaban singkatnya adalah bahwa requirements.txt
ini untuk daftar paket kebutuhan saja. setup.py
di sisi lain lebih seperti sebuah instalasi script. Jika anda don't berencana untuk memasang kode python, biasanya anda hanya akan perlu requirements.txt
.
File setup.py
menjelaskan, selain paket dependensi, mengatur file dan modul-modul yang harus dikemas (atau yang dihimpun, dalam kasus native modul (yaitu, yang ditulis dalam C)), dan metadata untuk menambah python paket listing (misalnya, nama paket, versi paket, paket deskripsi, penulis, ...).
Karena kedua file daftar dependensi, hal ini dapat menyebabkan sedikit duplikasi. Baca di bawah untuk rincian.
requirements.txt
File ini berisi daftar paket python persyaratan. Itu adalah sebuah file teks biasa (opsional dengan komentar-komentar) yang berisi daftar paket dependencies anda python project (satu per baris). Itu does not menggambarkan cara di mana anda python paket ini diinstal. Anda umumnya akan mengkonsumsi persyaratan berkas dengan pip install-r requirements.txt
.
Nama file dari file teks adalah sewenang-wenang, tetapi lebih sering requirements.txt
oleh konvensi. Ketika menjelajahi kode sumber repositori lain paket python, anda mungkin tersandung pada nama-nama lain, seperti dev-dependencies.txt
atau dependencies-dev.txt
. Mereka melayani tujuan yang sama sebagai dependencies.txt
tapi umumnya daftar dependensi tambahan yang menarik untuk pengembang dari paket tertentu, yaitu untuk menguji kode sumber (misalnya pytest, pylint, dll.) sebelum rilis. Pengguna paket ini umumnya tidak't perlu seluruh himpunan pengembang dependensi untuk menjalankan paket.
Jika beberapa`requirements-X.txt varian yang hadir, maka biasanya salah satu akan daftar dependensi runtime, dan lain membangun-waktu, atau uji dependensi. Beberapa proyek juga cascade mereka persyaratan berkas, yaitu ketika salah satu persyaratan file termasuk file yang lain (contoh). Hal tersebut dapat mengurangi pengulangan.
setup.py
Ini adalah sebuah script python yang menggunakan setuptools
modul untuk menentukan paket python (nama, file termasuk, paket metadata, dan instalasi). Itu akan, seperti requirements.txt
, juga daftar runtime dependensi dari paket. Setuptools adalah de-facto cara untuk membangun dan menginstal paket python, tetapi memiliki kekurangan, yang dari waktu ke waktu telah tumbuh pengembangan baru "meta-package manager", seperti pip. Contoh kekurangan dari setuptools adalah ketidakmampuan untuk menginstal beberapa versi dari paket yang sama, dan kurangnya uninstall perintah.
Ketika python pengguna tidak pip menginstal ./pkgdir_my_module
(atau pip menginstal my-modul
), pip akan menjalankan setup.py
di direktori yang diberikan (atau modul). Demikian pula, setiap modul yang memiliki setup.py
dapat pip
-dipasang, misalnya dengan menjalankan pip menginstal .
dari folder yang sama.
Apakah saya benar-benar membutuhkan investasi?
Jawaban singkatnya adalah tidak, tapi itu's baik untuk memiliki keduanya. Mereka mencapai tujuan yang berbeda, tetapi mereka dapat digunakan baik untuk daftar anda ketergantungan.
Ada satu trik yang dapat anda pertimbangkan untuk menghindari duplikasi daftar dependensi antara requirements.txt
dan setup.py
. Jika anda telah menulis sepenuhnya bekerja setup.py
untuk paket anda sudah, dan anda dependensi eksternal sebagian besar, anda bisa mempertimbangkan untuk memiliki sederhana requirements.txt
dengan hanya berikut:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
-E
khusus pip menginstal
pilihan yang menginstal paket yang diberikan di editable mode. Ketika pip -r requirements.txt
dijalankan pada file ini, pip akan menginstal dependensi melalui daftar di ./setup.py
. Diedit pilihan akan menempatkan symlink di direktori instalasi (bukan telur atau diarsipkan copy). Hal ini memungkinkan pengembang untuk mengedit kode di tempat dari repositori tanpa menginstal ulang.
Anda juga dapat mengambil keuntungan dari apa yang's disebut "setuptools ekstra" bila anda memiliki file dalam paket repository. Anda dapat menentukan paket pilihan di setup.py di bawah kategori kustom, dan menginstal paket-paket dari kategori tersebut dengan pip:
``python
dari setuptools impor setup setup( nama="ANU" ... extras_require = { 'dev': ['pylint'], 'membangun': ['permintaan'] } ... ) ``
dan kemudian, dalam berkas persyaratan: ``
-e path/ke/mypkg[membangun] ``
Ini akan membuat anda ketergantungan dalam daftar setup.py.
Note: Anda biasanya akan mengeksekusi pip dan setup.py dari sandbox, seperti yang dibuat dengan program virtualenv
. Ini akan menghindari menginstal python paket luar konteks proyek anda's pengembangan lingkungan.
Demi kelengkapan, di sini adalah bagaimana saya melihatnya dalam 3 sudut yang berbeda.
Ini adalah deskripsi yang tepat yang dikutip dari resmi documentation (penekanan dari saya):
Sedangkan install_requires (di setup.py) mendefinisikan dependensi untuk lajang proyek, Persyaratan Berkas yang sering digunakan untuk menentukan persyaratan untuk lingkungan Python.
Sedangkan install_requires persyaratan minimal, persyaratan file yang sering mengandung suatu daftar lengkap yang disematkan di versi untuk tujuan mencapai berulang instalasi lengkap lingkungan.
Tapi mungkin masih tidak mudah untuk dipahami, sehingga dalam bagian berikutnya, ada 2 faktual contoh untuk menunjukkan bagaimana 2 pendekatan yang seharusnya digunakan, berbeda.
foo
akan dirilis sebagai standalone perpustakaan (artinya, orang lain mungkin akan melakukan impor foo
), maka anda (dan anda pengguna hilir) yang ingin memiliki fleksibel deklarasi ketergantungan, sehingga perpustakaan anda tidak akan (dan tidak harus) menjadi "pilih-pilih" tentang apa yang tepat versi dependensi harus. Jadi, biasanya, anda setup.py akan berisi baris-baris seperti ini:install_requires=[ 'A>=1,<2', 'B>=2' ]
bar
, yang berarti, anda atau pengguna yang ingin menggunakan aplikasi anda bar
as-is, yaitu menjalankan python bar.py
, anda mungkin ingin membekukan lingkungan anda sehingga akan selalu berperilaku yang sama. Dalam kasus seperti ini, kebutuhan anda file akan terlihat seperti ini:A==1.2.3 B==2.3.4
pylint==3.4.5
Jika anda sedang mengembangkan sebuah aplikasi bar
yang akan digunakan oleh python bar.py
, bahkan jika itu adalah "hanya script untuk bersenang-senang", anda masih dianjurkan untuk menggunakan requirements.txt karena, siapa tahu, minggu depan (yang kebetulan Natal) anda akan menerima sebuah komputer baru sebagai hadiah, sehingga anda akan perlu untuk setup yang tepat anda lingkungan ada lagi.
Jika anda sedang mengembangkan sebuah perpustakaan foo
yang akan digunakan oleh impor foo
, anda harus mempersiapkan setup.py. Periode.
Tapi anda masih dapat memilih untuk juga memberikan requirements.txt pada saat yang sama, yang dapat:
(a) baik yang berada di A==1.2.3
gaya (seperti yang dijelaskan di #2 di atas);
(b) atau hanya mengandung magis tunggal .
.
yang akan kira-kira sama dengan "menginstal persyaratan berdasarkan setup.py" sementara tanpa duplikasi. Secara pribadi saya menganggap ini terakhir pendekatan semacam mengaburkan garis, menambah kebingungan dan TIDAK benar-benar menambah nilai, tetapi meskipun demikian trik yang berasal dari pendekatan yang disebutkan oleh Python kemasan pengelola Donald di blog post.