nixpkgs-unstable Overlay: Kararlı ile Güncel Paketleri Birlikte Kullanmak
NixOS ile başladığınızda erken karşılaşılan bir soru var: hangi nixpkgs kanalını kullanmalıyım?
Birkaç seçenek var: nixos-26.05 gibi bir sürüm kanalı, ya da nixpkgs-unstable. Kararlı kanal altı ayda bir çıkıyor ve testlerden geçmiş paketler içeriyor. Unstable ise nixpkgs’nin main dalı — günlük commit’ler, en yeni sürümler, ama daha az garanti.
Pratikte ne yaptım? İkisini birden.
Sorun: Bazı Paketler Kararlı Kanalda Yok ya da Çok Eski
Kararlı kanal nixos-26.05’te çalışırken üç paketle sorun yaşadım:
- ollama-rocm — AMD GPU’lar için özel ROCm destekli Ollama sürümü. Kararlı kanalda ya eksik ya da eski sürüm.
- claude-code — Anthropic’in CLI aracı. Sık güncelleniyor, kararlı kanaldaki sürüm geride kalıyor.
- antigravity — Agentic geliştirme platformu. Çok yeni, henüz kararlı kanalda yok.
Seçenek 1: Tüm sistemi nixpkgs-unstable’a taşımak. Ama bu, sistemi bir bütün olarak test edilmemiş paketlere açmak demek. Önemsiz değil.
Seçenek 2: Kararlı kanalı korurken belirli paketler için unstable kullanmak. Bunu overlay ile çözdüm.
Overlay Nedir?
NixOS’ta overlay, mevcut pkgs kümesini genişletme ya da değiştirme mekanizması. Bir fonksiyon alıyor (final: prev: { ... }) ve yeni bir attribute set döndürüyor. Bu sayede pkgs içine istediğiniz ek paketleri ya da override’ları ekleyebiliyorsunuz.
Unstable overlay bunun özel bir uygulaması: pkgs.unstable adıyla yeni bir attribute set ekliyorsunuz, içinde nixpkgs-unstable’dan gelen paketler var.
flake.nix’te Nasıl Kurulur?
İki adım:
1. Unstable nixpkgs’i input olarak tanımla:
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05"; # kararlı
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable"; # güncel
# ... diğer input'lar
};
2. Overlay ile pkgs.unstable ekle:
nixpkgs.overlays = [
(final: prev: {
unstable = import inputs.nixpkgs-unstable {
inherit system;
config.allowUnfree = true;
};
})
];
Bu tanımdan sonra herhangi bir Nix modülünde pkgs.unstable.paket-adi yazarak unstable sürüme erişebilirsiniz. Varsayılan pkgs hâlâ kararlı kanala işaret ediyor — unstable paket açıkça belirtilmediği sürece devreye girmiyor.
Gerçek Kullanım
modules/desktop/apps.nix’teki gerçek kullanım:
# Ollama: AMD GPU için ROCm destekli sürüm unstable'da
services.ollama = {
package = pkgs.unstable.ollama-rocm;
};
# Araçlar listesinde de karışık kullanım:
environment.systemPackages = with pkgs; [
# Kararlı kanaldan gelenler
git
neovim
# ...
# Unstable'dan gelenler
pkgs.unstable.antigravity # Agentic IDE
pkgs.unstable.claude-code # Claude CLI
];
pkgs.unstable.ollama-rocm yerine pkgs.ollama-rocm yazsaydım ya eski sürüm gelirdi ya da hata alırdım. Aradaki fark açık — hangi paketin hangi kanaldan geldiği kod içinde görünür.
Neden Her Şeyi Unstable’a Taşımadım?
Sık duyulan bir öneri: “Zaten unstable kullanıyorsan neden her şeyi oraya taşımıyorsun?”
Birkaç nedenim var:
Kararlılık garantisi. nixos-26.05 paketleri NixOS CI’dan geçmiş. Birbirleriyle uyumlu olduğu doğrulanmış. Unstable’da bazen bir paket başka bir paketle kısa süreliğine uyumsuz hale gelebiliyor.
Kademeli değişim. Kararlı kanal altı ayda bir büyük sıçrama yapıyor. Bu bir defada çok şeyin değişmesi demek — ama öngörülü. Unstable’da her gün yüzlerce commit geliyor. nixos-rebuild switch yaptığımda ne değiştiğini tam olarak bilemiyorum.
Seçici güncelleme. Overlay sayesinde sadece “unstable sürüm gerekiyor” dediğim paketleri işaretleyebiliyorum. Kalanı kararlı kalıyor.
flake.lock hâlâ her şeyi sabitliyor. İster kararlı ister unstable olsun, tüm input’lar flake.lock dosyasına commit hash olarak kaydediliyor. Unstable input kullanıyor olsam da, lock dosyası belirli bir noktayı işaret ediyor. Sistem belirsiz değil — sadece daha güncel.
Hyprland Özel Durumu
Overlay’in yanı sıra farklı bir pattern daha var: flake input’un hangi nixpkgs’i takip ettiğini belirtmek.
Örneğin Hyprland:
hyprland = {
url = "github:hyprwm/Hyprland?ref=v0.55.0";
inputs.nixpkgs.follows = "nixpkgs-unstable";
};
Bu satır “Hyprland’in kendi nixpkgs bağımlılığı unstable’ı takip etsin” diyor. Hyprland’i doğrudan pkgs.unstable.hyprland ile çekmiyorum — Hyprland ayrı bir flake input olarak geliyor, sadece kendi iç bağımlılıkları için unstable nixpkgs kullanıyor. Bu, Hyprland’in yeni nixpkgs özelliklerine bağlı API’leri kullanabilmesini sağlıyor.
Her iki yaklaşım da kullanım yerine göre mantıklı:
pkgs.unstable.paket→ Unstable kanaldan belirli bir paketi çekinputs.X.inputs.nixpkgs.follows = "nixpkgs-unstable"→ X flake’inin nixpkgs bağımlılığını yönlendir
Sonuç
Overlay kurulumu basit, kazancı net:
- Sistem kararlı kanalda çalışıyor
pkgs.unstable.xxxile sadece ihtiyaç duyulan paketler unstable’dan geliyor- Hangi paketin neden unstable’dan geldiği kodda görünür
flake.lockher iki kanalı da sabitliyor, sistem deterministik kalıyor
“Unstable mı yoksa kararlı mı?” sorusu ikisi arasında seçim yapmak zorunda olmadığınızı fark edince daha az acil hale geliyor.
İlgili: Home Manager: Kullanıcı Ortamını Nix ile Yönetmek