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:

bash
pip freeze > requirements.txt

Berikut hasil nyata dari venv berisi build yang kita pasang pada Chapter Menggunakan pip:

text
build==1.6.1
packaging==26.3
pyproject_hooks==1.3.3

File 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:

bash
pip install -r requirements.txt

Output yang Dihasilkan:

text
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.3

Mari kita telaah transkrip di atas:

  1. Collecting build==1.6.1 (from -r requirements.txt (line 1)): setiap baris file diperlakukan seperti argumen pip install, dan pip mencantumkan nomor barisnya sebagai jejak.
  2. Urutan pengumpulan: pip mengumpulkan ketiga requirement sesuai urutan file, menyelesaikan pohon dependency di antara ketiganya, baru memasang semuanya sekali jalan.
  3. Successfully installed ...: environment baru kini memuat versi yang sama persis dengan environment asal.

Verifikasi paling sederhana: impor package dan cetak versinya.

bash
python3 -c "import build; print(build.__version__)"

Output yang Dihasilkan:

text
1.6.1

Direct 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.

AspekDirect dependencyTransitive dependency
Definisipackage yang kode kita panggil sendiridependency milik direct dependency
Contoh pada venv di atasbuildpackaging, pyproject_hooks
Siapa yang seharusnya menuliskannyakita, secara sadarhasil 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.txt setiap 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.