Nix Package Manager Tutorial: Instalasi & Pakai Sehari-hari

by Marcus Chen
Nix Package Manager Tutorial: Instalasi & Pakai Sehari-hari

Nix Package Manager Tutorial: Instalasi & Pakai Sehari-hari

Sudah berapa kali setup dev environment kamu rusak setelah apt upgrade? Atau paket yang jalan di laptop sendiri tiba-tiba error di mesin teman satu tim? Masalah klasik. Saya sudah mengalaminya terlalu sering sampai akhirnya mencoba Nix — dan tidak pernah kembali ke cara lama.

Nix bukan package manager biasa. Ia memperlakukan setiap paket sebagai output dari fungsi murni (pure function): input yang sama selalu menghasilkan output yang sama. Tidak ada state tersembunyi, tidak ada library yang saling menimpa. Hasilnya: environment yang benar-benar reproducible, bisa di-share ke siapapun, dan bisa di-rollback dalam hitungan detik.

Di artikel ini saya akan tunjukkan cara install Nix, pakai nix-shell untuk proyek spesifik, dan mulai menulis shell.nix pertama kamu. Tidak perlu sudah paham functional programming atau NixOS — kita mulai dari nol.

Kenapa Nix, Bukan Homebrew atau asdf?

Pertanyaan wajar. Homebrew cukup untuk banyak orang. asdf bagus untuk version manager bahasa pemrograman. Tapi keduanya punya masalah yang sama: mereka memodifikasi state global sistem kamu.

Coba jalankan brew upgrade di tengah proyek aktif. Ada kemungkinan versi Python atau Node berubah tanpa kamu minta. asdf lebih terkontrol, tapi ia masih bergantung pada .tool-versions yang hanya mengatur versi, bukan dependensi sistem level bawah seperti openssl atau libpq.

Nix menyimpan setiap paket di path unik seperti /nix/store/abc123-nodejs-20.11.0/. Dua versi Node bisa hidup berdampingan tanpa konflik. Ketika kamu keluar dari nix-shell, environment itu hilang dari PATH — sistem kamu bersih seperti semula.

Satu lagi: shell.nix bisa di-commit ke repo. Siapapun yang clone repo itu dan jalankan nix-shell akan mendapat environment yang identik, di Linux maupun macOS.

Instalasi Nix di Linux dan macOS

Cara paling aman adalah pakai installer resmi dari Determinate Systems (bukan installer lama dari nixos.org yang agak ribet untuk uninstall):

curl --proto '=https' --tlsv1.2 -sSf \
  https://install.determinate.systems/nix | sh -s -- install

Installer ini (versi 0.9.x per Januari 2025) otomatis mengaktifkan Nix Flakes dan nix-command — dua fitur yang secara teknis masih "experimental" tapi sudah dipakai mayoritas komunitas. Ia juga lebih mudah di-uninstall dibanding installer resmi.

Setelah selesai, tutup terminal dan buka lagi. Verifikasi:

nix --version
# nix (Nix) 2.24.x

Kalau muncul versi, instalasi berhasil. Tidak perlu konfigurasi tambahan untuk mulai.

Pakai nix-shell untuk Isolasi Cepat

Skenario paling umum: kamu butuh tool tertentu hanya untuk satu sesi kerja, tanpa menginstalnya secara permanen.

# Butuh jq untuk parsing JSON, tapi tidak mau install global
nix-shell -p jq

# Sekarang jq tersedia
jq --version
# jq-1.7.1

# Keluar dari shell
exit

# jq tidak ada lagi di PATH
jq --version
# command not found

Sederhana, tapi powerful. Saya sering pakai ini untuk tools sekali-pakai seperti imagemagick, ffmpeg, atau bahkan versi Python spesifik:

nix-shell -p python311 python311Packages.requests

Kamu juga bisa langsung jalankan command tanpa masuk ke shell interaktif:

nix-shell -p ripgrep --run "rg 'TODO' ./src"

Ini berguna banget untuk CI atau script otomasi.

Menulis shell.nix Pertama Kamu

Ini inti dari Nix package manager tutorial ini. File shell.nix adalah deklarasi environment kamu — commit ke repo, dan semua orang punya setup yang sama.

Buat file shell.nix di root proyek:

{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  name = "my-project-env";

  buildInputs = with pkgs; [
    nodejs_20
    nodePackages.pnpm
    postgresql_16
    redis
    jq
    curl
  ];

  shellHook = ''
    echo "Environment siap. Node $(node --version), PostgreSQL $(psql --version)"
    export DATABASE_URL="postgresql://localhost/myapp_dev"
  '';
}

Lalu jalankan:

nix-shell
# Environment siap. Node v20.11.0, PostgreSQL psql (PostgreSQL) 16.2

Beberapa hal yang perlu diperhatikan:

  • buildInputs adalah daftar paket yang masuk ke environment kamu.
  • shellHook dijalankan setiap kali kamu masuk ke shell — cocok untuk set environment variable atau print pesan.
  • { pkgs ? import <nixpkgs> {} } artinya kamu pakai nixpkgs dari channel yang terinstall. Ini cukup untuk mulai, tapi punya kelemahan: versi nixpkgs bisa berbeda antar mesin.

Untuk fix masalah itu, kamu butuh pinning — tapi itu topik untuk artikel tersendiri.

Cari Paket dengan Nix Search

Salah satu friction terbesar saat awal pakai Nix: nama paket tidak selalu intuitif. python3 bukan python, nodejs_20 bukan node20.

Ada beberapa cara cari:

1. Website search.nixos.org

Buka search.nixos.org/packages — ini cara paling cepat. Filter by channel (pilih nixos-unstable untuk paket paling baru).

2. Command line

nix search nixpkgs postgresql

Output-nya verbose tapi informatif:

* legacyPackages.x86_64-linux.postgresql_16 (16.2)
  A powerful, open source object-relational database system

* legacyPackages.x86_64-linux.postgresql_15 (15.6)
  ...

3. nix-env -qaP

nix-env -qaP | grep -i redis

Cara lama, tapi kadang masih berguna untuk filter cepat.

Tips: kalau nama paket tidak ketemu, coba cari nama binary-nya di mynixos.com — situs komunitas yang indexnya lebih lengkap.

Rollback: Fitur yang Sering Dilupakan

Ini salah satu fitur Nix yang underrated. Setiap kali kamu install atau upgrade paket secara global (via nix-env), Nix membuat "generation" baru. Kamu bisa rollback ke generation sebelumnya kapan saja.

# Lihat semua generation
nix-env --list-generations

# Output:
#   1   2024-11-01 10:23:45
#   2   2025-01-15 14:30:12   (current)

# Rollback ke generation sebelumnya
nix-env --rollback

# Atau ke generation spesifik
nix-env --switch-generation 1

Ini berbeda dengan shell.nix yang sudah kita bahas — rollback ini untuk paket yang diinstall secara permanen di user profile. Untuk proyek berbasis shell.nix, "rollback" cukup dengan git checkout file-nya.

Kalau kamu pakai Nix di NixOS, mekanisme generasi ini berlaku untuk seluruh sistem — termasuk kernel dan service. Tapi itu sudah di luar scope artikel ini.

Perbandingan: Nix vs Alternatif Lain

Fitur Nix Homebrew asdf Docker (dev)
Reproducible environment ✅ Sangat kuat ❌ Tidak ⚠️ Sebagian ✅ Kuat
Isolasi per-proyek ✅ via shell.nix ✅ via .tool-versions ✅ via Dockerfile
Rollback ✅ Built-in ❌ Manual ⚠️ Manual
Kurva belajar 🔴 Tinggi 🟢 Rendah 🟡 Sedang 🟡 Sedang
Support macOS ⚠️ Lambat di Mac
Paket tersedia ~100rb+ ~7rb+ Bahasa saja Tergantung image
Ukuran overhead Kecil Sedang Kecil Besar

Docker tetap pilihan bagus untuk deployment dan testing environment yang butuh isolasi OS penuh. Tapi untuk dev environment sehari-hari, overhead-nya terlalu besar — terutama di macOS dengan Docker Desktop yang makan RAM.

Nix lebih ringan dan lebih dekat ke sistem native, tapi kurva belajarnya nyata. Jangan ekspektasi bisa mahir dalam sehari.

Integrasi dengan direnv: Otomatis Masuk Shell

Satu hal yang sedikit mengganggu dari nix-shell: kamu harus menjalankannya manual setiap masuk ke direktori proyek. Solusinya: direnv + nix-direnv.

Install dulu:

# Install direnv dan nix-direnv
nix-env -iA nixpkgs.direnv nixpkgs.nix-direnv

Tambahkan ke shell config kamu (~/.bashrc atau ~/.zshrc):

eval "$(direnv hook bash)"
# atau untuk zsh:
eval "$(direnv hook zsh)"

Buat file .envrc di root proyek:

use nix

Lalu:

direnv allow

Sekarang setiap kali kamu cd ke direktori itu, Nix shell langsung aktif otomatis. Keluar dari direktori, environment hilang. Tidak perlu ingat-ingat lagi.

Ini setup yang saya pakai di semua proyek sekarang. Kalau kamu tertarik dengan setup dotfiles dan environment management yang lebih lengkap, lihat juga artikel tentang manajemen dotfiles dengan Git bare repository yang pernah saya tulis sebelumnya.

Kesimpulan

Nix bukan tool yang bisa kamu kuasai dalam satu sore. Tapi investasi belajarnya sepadan — terutama kalau kamu sering berpindah antar proyek dengan dependency berbeda, atau bekerja di tim yang sering mengalami masalah "works on my machine".

Dari Nix package manager tutorial ini, hal paling konkret yang bisa langsung kamu coba:

  1. Install Nix via Determinate Systems installer.
  2. Coba nix-shell -p jq untuk rasakan isolasi environment.
  3. Buat shell.nix sederhana di satu proyek aktif kamu.
  4. Pasang direnv supaya tidak perlu manual setiap saat.

Langkah selanjutnya setelah ini nyaman: pelajari Nix Flakes untuk pinning versi nixpkgs yang lebih deterministik. Tapi jangan loncat ke sana dulu — kuasai shell.nix dulu, dan rasakan sendiri bedanya.

Kalau kamu sudah punya setup Nix yang menarik atau punya pertanyaan spesifik, tulis di kolom komentar. Saya baca semua.