Venv proyek kita kini berisi package dengan versi tertentu — tetapi venv itu ada hanya di komputer kita. Rekan tim, server CI, dan server produksi perlu membangun environment yang isinya persis sama, dan mengingat puluhan nama package beserta versinya dari kepala bukanlah cara yang andal. File requirements.txt menyelesaikannya: satu daftar tertulis yang bisa dibaca pip untuk membangun ulang seluruh kumpulan dependency.
Membuat requirements.txt dengan pip freeze #
Perintah pip freeze mencetak seluruh package terpasang di environment aktif dalam format nama==versi. Dengan redirection shell, hasilnya langsung menjadi file:
pip freeze > requirements.txtBerikut hasil nyata dari venv berisi build yang kita pasang pada Chapter Menggunakan pip:
build==1.6.1
packaging==26.3
pyproject_hooks==1.3.3File ini diletakkan di akar proyek, bersebelahan dengan folder .venv. Perhatikan bahwa pip freeze mencatat versi eksak dengan operator == — inilah yang membuat daftarnya bisa direproduksi: pip tidak bebas memilih versi lain saat membacanya.
Menginstal dari requirements.txt #
Di komputer lain (atau di venv baru), satu perintah membangun ulang seluruh environment:
pip install -r requirements.txtOutput yang Dihasilkan:
Collecting build==1.6.1 (from -r requirements.txt (line 1))
Using cached build-1.6.1-py3-none-any.whl.metadata (5.6 kB)
Collecting packaging==26.3 (from -r requirements.txt (line 2))
Using cached packaging-26.3-py3-none-any.whl.metadata (3.5 kB)
Collecting pyproject_hooks==1.3.3 (from -r requirements.txt (line 3))
Using cached pyproject_hooks-1.3.3-py3-none-any.whl.metadata (1.3 kB)
Using cached build-1.6.1-py3-none-any.whl (31 kB)
Using cached packaging-26.3-py3-none-any.whl (129 kB)
Using cached pyproject_hooks-1.3.3-py3-none-any.whl (10 kB)
Installing collected packages: pyproject_hooks, packaging, build
Successfully installed build-1.6.1 packaging-26.3 pyproject_hooks-1.3.3Mari kita telaah transkrip di atas:
Collecting build==1.6.1 (from -r requirements.txt (line 1)): setiap baris file diperlakukan seperti argumenpip install, dan pip mencantumkan nomor barisnya sebagai jejak.- Urutan pengumpulan: pip mengumpulkan ketiga requirement sesuai urutan file, menyelesaikan pohon dependency di antara ketiganya, baru memasang semuanya sekali jalan.
Successfully installed ...: environment baru kini memuat versi yang sama persis dengan environment asal.
Verifikasi paling sederhana: impor package dan cetak versinya.
python3 -c "import build; print(build.__version__)"Output yang Dihasilkan:
1.6.1Direct dan Transitive Dependency #
Ada satu ketegangan dalam file requirements.txt: pip freeze mencatat semua package, tanpa membedakan mana yang kita perlukan langsung dan mana yang sekadar dibutuhkan package lain.
| Aspek | Direct dependency | Transitive dependency |
|---|---|---|
| Definisi | package yang kode kita panggil sendiri | dependency milik direct dependency |
| Contoh pada venv di atas | build | packaging, pyproject_hooks |
| Siapa yang seharusnya menuliskannya | kita, secara sadar | hasil resolusi pip |
Kekuatan format ini adalah kelengkapannya — tidak ada yang terlewat. Kelemahannya: campur jadi satu. Saat kita berhenti memakai build, tidak ada penanda otomatis mana baris yang boleh dihapus. Praktik yang tumbuh di komunitas adalah memisahkan dua file: requirements.in berisi direct dependency saja, lalu tool seperti pip-tools yang menghasilkan requirements.txt lengkap darinya — topik yang kita bahas penuh pada Chapter Memahami Lockfiles.
requirements.txt dalam Tim #
File ini jauh lebih berguna ketika hidup di version control bersama kode:
- Commit
requirements.txtsetiap daftar dependency berubah, dengan pesan commit yang menjelaskan alasannya. - CI dan deployment selalu memasang lewat
pip install -r requirements.txt, bukan menghitung sendiri daftarnya. - Tidak commit
.venv— environment dibangun ulang dari file ini, bukan disalin mentah.