Package Managers

Package manager mengotomasi instalasi, pembaruan, penghapusan, dan pengelolaan dependensi perangkat lunak. Contoh yang umum dipakai adalah npm untuk JavaScript, pip untuk Python, yarn, pnpm, Cargo untuk Rust, dan apt untuk sistem operasi. Dengan menyelesaikan dependensi transitif, mengunci versi lewat lockfile, dan memverifikasi integritas artefak, package manager memungkinkan berbagi kode dan setup proyek yang konsisten antar mesin. Perannya menjadi fondasi workflow pengembangan modern yang kolaboratif.

Apa yang diotomasi

Tanpa package manager, pustaka ditambahkan manual: unduh file, letakkan di folder, lalu atur urutan tag <script> di HTML. Cara ini rapuh saat ada pembaruan dan mudah menimbulkan konflik versi. Package manager menggantinya dengan deklarasi dependensi di manifest, resolusi otomatis, dan instalasi yang dapat direproduksi di setiap mesin.

Komponen utama

Arsitektur umumnya terdiri dari beberapa lapisan yang saling terkait. Jumlah dan penamaannya bervariasi menurut implementasi, tetapi pola berikut hampir selalu ada.

1. Manifest

File deklarasi dependensi langsung seperti package.json, Cargo.toml, pyproject.toml, go.mod, atau Gemfile. File ini berisi rentang versi (^18.2.0, >=1.0 <2.0), bukan versi konkret. Developer mengelola file ini sebagai input utama resolver.

2. Registry

Server HTTP yang menyimpan metadata dan artefak, misalnya npm registry, PyPI, crates.io, Maven Central, dan RubyGems. Di npm, metadata ini disebut packument dan berisi daftar versi, dist-tag seperti latest, daftar dependensi, URL tarball, serta hash integritas.

3. Resolver

Mesin yang menyelesaikan constraint versi. Resolver menelusuri dependency graph secara breadth-first, mengumpulkan semua constraint untuk satu nama paket, lalu memilih versi yang memenuhi semuanya. Jika terjadi konflik, misalnya paket A butuh lodash@^3 sementara B butuh lodash@^4, resolver akan memasang dua salinan terpisah atau melaporkan error. Strateginya berbeda-beda, dari lowest applicable version dan direct-dependency-wins hingga resolusi yang sadar semver seperti di Cargo dan NuGet.

4. Fetcher dan cache

Lapisan ini mengunduh tarball dan memverifikasi hash. Cache yang agresif mempercepat instalasi berikutnya (~/.npm/_cacache, ~/.pnpm-store). pnpm memakai Content-Addressable File System (CAFS): file diindeks dengan hash SHA-512 dan dibagikan antar proyek lewat hard link atau reflink, sehingga hemat disk dan waktu.

5. Linker

Lapisan yang menempatkan file agar runtime dapat menemukannya. Ada dua pendekatan. Pendekatan berorientasi database (apt/dpkg, pip) mengizinkan paket menaruh file di lokasi mana saja dan mencatat pemetaannya di database lokal. Pendekatan berorientasi filesystem (RubyGems, Nix, pnpm strict) menempatkan tiap versi di subtree terisolasi (node_modules/.pnpm) dan hanya mengekspos symlink di tingkat atas, sehingga mencegah phantom dependency.

6. Lockfile

Output resolver yang dibekukan: package-lock.json, pnpm-lock.yaml, yarn.lock, Cargo.lock, Gemfile.lock, poetry.lock, go.sum. File ini mencatat versi konkret, URL resolved, hash integrity (SHA-512), dan dependensi transitif. Fungsinya adalah melewati resolusi ulang, memverifikasi integritas, dan menjaga build tetap reproduktif. Untuk aplikasi, commit lockfile ke repositori dan jangan edit manual. Di CI, gunakan npm ci, pnpm install --frozen-lockfile, atau cargo --locked.

7. Database lokal dan konfigurasi

Database paket terinstal (misalnya status dpkg, rpmdb) dan sistem konfigurasi berlapis dengan urutan prioritas: argumen CLI, environment variable, .npmrc, lalu pnpm-workspace.yaml.

8. CLI

Antarmuka perintah seperti install, update, remove, dan audit. Pada Yarn Berry, inti @yarnpkg/core dipisah dari plugin resolver, fetcher, dan linker.

Jenis package manager

Jenis Cakupan Contoh
OS-level System-wide, binary, layanan apt (Debian/Ubuntu), dnf (Fedora), pacman (Arch), apk (Alpine), brew (macOS), winget (Windows)
Language-level Satu ekosistem bahasa npm/yarn/pnpm/bun (JS), pip/poetry/uv (Python), cargo (Rust), go mod (Go), maven/gradle (Java), nuget (C#), bundler (Ruby)
Universal Multi-bahasa, environment conda, nix/guix (fungsional, reproduktif), snap/flatpak (runtime terisolasi)
Application-level App store, tanpa resolusi dependensi App Store, Google Play

Kombinasi yang umum adalah apt untuk compiler dan library C, uv untuk Python, dan nvm+npm untuk Node. nix atau flox dapat menggantikan keduanya dengan lingkungan deklaratif lintas bahasa.

Alur kerja

Urutan umumnya adalah: parse manifest, query registry (packument), resolver membangun dependency graph, tulis lockfile, fetch dan verifikasi hash, link ke proyek, lalu jalankan lifecycle hook. Instalasi berikutnya cukup membaca lockfile tanpa resolusi ulang.

Fitur inti

Fitur yang biasanya tersedia meliputi resolusi dependensi, rentang versi dan semver, peer dependency, enforcement lockfile, verifikasi integritas, strategi hoisting versus isolasi strict, workspaces untuk monorepo, audit keamanan, dan script hook.

Kapan memakai apa

Pakai package manager level OS untuk sistem, compiler, dan library. Pakai yang level bahasa untuk dependensi proyek. Untuk reproduktibilitas lintas mesin CI dan produksi, andalkan lockfile dan perkakas yang terintegrasi seperti uv, poetry, volta, atau bun/deno, atau pendekatan deklaratif seperti nix. Hindari klaim file ganda antara dua manager di path yang sama.

Lihat juga

Sumber