Jawaban singkatnya requirements.txt
adalah untuk mencantumkan persyaratan paket saja. setup.py
di sisi lain lebih seperti skrip instalasi. Jika Anda tidak berencana memasang kode python, biasanya Anda hanya perlu requirements.txt
.
File tersebut setup.py
menjelaskan, selain dependensi paket, kumpulan file dan modul yang harus dikemas (atau dikompilasi, dalam kasus modul asli (yaitu, ditulis dalam C)), dan metadata untuk ditambahkan ke daftar paket python ( misalnya nama paket, versi paket, deskripsi paket, pembuat, ...).
Karena kedua file mencantumkan dependensi, ini dapat menyebabkan sedikit duplikasi. Baca detailnya di bawah.
persyaratan.txt
File ini mencantumkan persyaratan paket python. Ini adalah file teks biasa (opsional dengan komentar) yang mencantumkan dependensi paket proyek python Anda (satu per baris). Ini tidak menjelaskan cara paket python Anda diinstal. Anda biasanya akan menggunakan file persyaratan dengan pip install -r requirements.txt
.
Nama file dari file teks tersebut sewenang-wenang, tetapi sering kali requirements.txt
berdasarkan konvensi. Saat menjelajahi repositori kode sumber dari paket python lainnya, Anda mungkin tersandung pada nama lain, seperti dev-dependencies.txt
atau dependencies-dev.txt
. Mereka melayani tujuan yang sama dependencies.txt
tetapi umumnya mencantumkan dependensi tambahan yang menarik bagi pengembang paket tertentu, yaitu untuk menguji kode sumber (misalnya pytest, pylint, dll.) Sebelum rilis. Pengguna paket umumnya tidak memerlukan seluruh rangkaian dependensi developer untuk menjalankan paket.
Jika ada beberapa requirements-X.txt
varian, biasanya salah satu akan mencantumkan dependensi waktu proses, dan yang lainnya akan mencantumkan dependensi waktu proses, atau menguji dependensi. Beberapa proyek juga menurunkan file persyaratan mereka, yaitu ketika satu file persyaratan menyertakan file lain ( contoh ). Melakukannya dapat mengurangi pengulangan.
setup.py
Ini adalah skrip python yang menggunakan setuptools
modul untuk mendefinisikan paket python (nama, file yang disertakan, metadata paket, dan instalasi). Ini akan, seperti requirements.txt
, juga mencantumkan dependensi runtime dari paket tersebut. Setuptools adalah cara de-facto untuk membangun dan menginstal paket python, tetapi ia memiliki kekurangan, yang seiring waktu telah menumbuhkan pengembangan "manajer paket meta" baru, seperti pip. Contoh kekurangan dari setuptools adalah ketidakmampuannya untuk menginstal beberapa versi dari paket yang sama, dan kurangnya perintah uninstall.
Ketika pengguna python melakukan pip install ./pkgdir_my_module
(atau pip install my-module
), pip akan berjalan setup.py
di direktori (atau modul) yang diberikan. Demikian pula, modul apa pun yang memiliki a setup.py
dapat pip
diinstal, misalnya dengan menjalankan pip install .
dari folder yang sama.
Apakah saya benar-benar membutuhkan keduanya?
Jawaban singkatnya adalah tidak, tapi senang memiliki keduanya. Keduanya mencapai tujuan yang berbeda, tetapi keduanya dapat digunakan untuk membuat daftar dependensi Anda.
Ada satu trik yang dapat Anda pertimbangkan untuk menghindari duplikasi daftar dependensi antara requirements.txt
dan setup.py
. Jika Anda telah menulis sepenuhnya berfungsi setup.py
untuk paket Anda, dan dependensi Anda sebagian besar eksternal, Anda dapat mempertimbangkan untuk memiliki yang sederhana requirements.txt
hanya dengan yang 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)
# .
Ini -e
adalah pip install
opsi khusus yang menginstal paket yang diberikan dalam mode yang dapat diedit . Ketika pip -r requirements.txt
dijalankan pada file ini, pip akan menginstal dependensi Anda melalui daftar di ./setup.py
. Opsi yang dapat diedit akan menempatkan symlink di direktori pemasangan Anda (bukan telur atau salinan yang diarsipkan). Ini memungkinkan pengembang untuk mengedit kode dari repositori tanpa menginstal ulang.
Anda juga dapat memanfaatkan apa yang disebut "tambahan setuptools" ketika Anda memiliki kedua file dalam repositori paket Anda. Anda dapat mendefinisikan paket opsional di setup.py di bawah kategori khusus, dan menginstal paket itu hanya dari kategori itu dengan pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
dan kemudian, di file persyaratan:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Ini akan menyimpan semua daftar ketergantungan Anda di dalam setup.py.
Catatan : Anda biasanya akan menjalankan pip dan setup.py dari kotak pasir, seperti yang dibuat dengan program ini virtualenv
. Ini akan menghindari pemasangan paket python di luar konteks lingkungan pengembangan proyek Anda.