Bu makalede yine öncekilerde yaptığımız gibi ufak örneklerle mevzuyu anlamaya çalışacağız. Bir sonraki yazımızda da nix dosyaları üzeriden daha karmaşık örnekler yapacağız.
- NixOS: İşletim Sistemlerine Fonksiyonel Yaklaşım
- Nix Dili ve Özellikleri
- Nix Dili ile ilgili Alıştırmalar
- Nix Dilinde Builtins Fonksiyonlar
- Nix Paket Yöneticisi
- Nix Paket Yöneticisi Shell, Profile Kavram ve Komutları
- Nix Flake Nedir?
- Birden Çok Paketi Aynı Repo Üzeriden Yayınlamak
- Override ve Overlay Kavramları
- Nix Paket Yöneticisi ile Developer ve Profile Ortamları Oluşturmak
- Nix ile NixOs Konfigürasyonu
- NixOs Module ve Option Kullanımı
- NixOs Kurulumu ve Konfigürasyonu
- NixOs'u Cloud ve Uzak Ortamlara Deploy Etmek
Nix shell hakkında resmi dokümanlara bakacak olursanız development ortamı oluşturmak için kullanılır der. Özellikle biden fazla dilde ve birden fazla versiyonla çalışıyorsanız hakikaten çok kullanışlı. Yazılım geliştirme dışında başka bir alan gelmiyor aklıma ancak aynı aracın farklı versiyonlarıyla çalışıyorsanız kullanışlı olabilir. Ayrıca sonraki makalelerimizde göreceğimiz üzere shell'i nix dosyaları ile kullanmak da mümkün. Bu sayede sisteminizde ilgili yazılımları devamlı kurulu tutmak zorunda değilsiniz.
İsterseniz biraz alıştırma yapalım. Bu makalede amacımız cli üzerinden komutlarla bir şeyler yaparak shell'i anlamaya çalışmak. Bir sonraki makalemizde nix dosyaları ile declarative olarak yapacağız aynı örnekleri.
Şimdi Python version 2 ile bir uygulama geliştireceğimizi ve bunu sadece ilgili dizindeyken kullanacağımızı varsayalım. Usulündendir önce uygulamayı arayalım.resmi paket sayfasından da arama yapabilirsiniz. Dikkat etmeniz gereken konu biz channel kullanmıyoruz flake üzerinden gidiyoruz bundan dolayı alttaki adresleri kullanmalısınız. Options'ları henüz görmedik ama ileride değineceğiz.
- Package ararken: search.nixos.org/flakes?type=packages
- Options ararken: search.nixos.org/flakes?type=options
Repl kullanırken de arama yapabiliriz.
nix repl
:load <nixpkgs>
# Added 19423 variables.
# örneğin firef yazıp tab a basacak olursak alttaki gibi bir liste göreceğiz.
fire firectl firefox-bin-unwrapped firefox-esr-unwrapped firestarter
firebase-tools firefly-desktop firefox-devedition firefox-mobile firewalld
Ancak biz komut satırını kullanarak çalışacağız. Aramada öncelikle nerede arama yapacağımızı söylüyoruz. Burada nixpkgs ile Nix'in standart repo'sunda arama yaptığımızı ve python2 ile de aradığımız kelimeyi belirtiyoruz.
Arama sonucunda legacyPackages yazdığına bakmayın yani burada sanki eski bir repo üzerinde arama yapıyormuşuz gibi görünüyor ama öyle değil aslında sadece kötü bir isimlendirme diyebiliriz.
Bu arada biz arama yaparken hangi repo'da arma yaptığımız belirtmeliyiz. Bunun için arama yapacağımız repo adını nixpkgs olarak yazdık ancak unutmayalım bu sadece GitHub'daki bir adres. Aslında Github'da NixOs kullanıcısının nixpkgs adlı reposunda arama yapıyoruz. komutun uzun halide aşağıda yazıyor.
nix search nixpkgs python # veya nix search github:NixOS/nixpkgs#python
# sonuç
# ---------------- kısaltıldı
# * legacyPackages.x86_64-linux.python2 (2.7.18.7)
# A high-level dynamically-typed programming language
# * legacyPackages.x86_64-linux.python27 (2.7.18.7)
# A high-level dynamically-typed programming language
# * legacyPackages.x86_64-linux.python27Full (2.7.18.7)
# A high-level dynamically-typed programming language
# * legacyPackages.x86_64-linux.python2Full (2.7.18.7)
# A high-level dynamically-typed programming language
# --------------- kısaltıldı
Evet aradığımızı bulduk artık yükleyebiliriz. Listede ilk sıradaki python2 paketini kuruyoruz.Şunu unutmamamız gerekiyor aslında nixpkgs bir flake ve onun bir output'u python2'yi kuruyoruz. Arada neden # işareti olduğunu ileride daha detaylı inceleyeceğiz.
nix shell nixpkgs#python2
Ancak bu komutu çalıştırdığımızda hata aldık. Hatanın detaylarını inceleyecek olursak alttaki mesajı göreceğiz.
error: Package ‘python-2.7.18.7’ in /nix/store/fjvkr94j3lwca8y66zccn15rjwzqn0rd-source/pkgs/development/interpreters/python/cpython/2.7/default.nix:335 is marked as insecure, refusing to evaluate.
Known issues:
- Python 2.7 has reached its end of life after 2020-01-01. See https://www.python.org/doc/sunset-python-2/.
You can install it anyway by allowing this package, using the
following methods:
a) To temporarily allow all insecure packages, you can use an environment
variable for a single invocation of the nix tools:
$ export NIXPKGS_ALLOW_INSECURE=1
Note: When using `nix shell`, `nix build`, `nix develop`, etc with a flake,
then pass `--impure` in order to allow use of environment variables.
b) for `nixos-rebuild` you can add ‘python-2.7.18.7’ to
`nixpkgs.config.permittedInsecurePackages` in the configuration.nix,
like so:
{
nixpkgs.config.permittedInsecurePackages = [
"python-2.7.18.7"
];
}
c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
‘python-2.7.18.7’ to `permittedInsecurePackages` in
~/.config/nixpkgs/config.nix, like so:
{
permittedInsecurePackages = [
"python-2.7.18.7"
];
}
Hata bize güvenli olmayan bir paketi yüklemeye çalıştığımız söylüyor. Bunun sebebini açıkça söylemiş çünkü Python 2.7 yakında tedavülden kalkacakmış. Ama tabii ki biz yine de kurmak isteyeceğiz.
Ayrıca bir paketi kuramamamızın başka sebepleri de olabilir.
- Bozuk paketler
- Paketi kurduğumuz sitem pakete uyumlu olmayabilir
- Paket free olmayabilir
- Paket güvenilir olamayabilir.
Sadece bu durum için çözmek istiyorsak Kurulum yapmadan önce alttaki komutları çalıştırmalıyız.
export NIXPKGS_ALLOW_BROKEN=1
export NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1
export NIXPKGS_ALLOW_UNFREE=1
export NIXPKGS_ALLOW_INSECURE=1
Bizim durumumuz insecure uygulama olduğu için sonuncu seçenekle devam ediyoruz. Hata mesajında ayrıca environment variable'ı kullanabilmek için impure etiketini de komutumuza eklememiz gerektiği söylenmiş.
Tam bu noktada pure ve impure kavramlarında değinelim. Bir nix expression, flake, paket vb artık nix ilgili ne varsa :) bulunduğu ortama vay kullanıcıya bağlı bir kod içermiyorsa buna pure diyoruz. Eğer Nix dışında bir yerlere dokunuyorsa veya bağımlılığı vs varsa o zaman impure diyoruz. Burada da hata mesajında denildiği gibi environment variable kullanımı gerektiği için impure eklememiz isteniyor. Bu arada default olan pure'dur.
export NIXPKGS_ALLOW_INSECURE=1
nix shell nixpkgs#python2 --impure
Artık Python'ı kurabiliyoruz. Şimdi denildiği gibi,
- sadece bu dizinde mi kullanabiliyoruz,
- sadece burada kullanabiliyorsak bunu nasıl yapabiliyor
- ve terminali kapattığımızda neler oluyor gibi soruların cevabını araştıralım.
Öncelikle hakikaten Python 2.7 çalışıyor mu buna bakalım. Yine aynı dizinde açtığımız terminal de python2
komutunu çalıştırdığımızda python repl'ine giriş yapmış olmalıyız. Çıkmak için exit()
fonksiyonunu çalıştırıyoruz.
Bu terminal açıkken başka bir terminal açıp python2 çalıştırdığınızda çalışmadığını görebilirsiniz. Hatta aynı dizinde bile çalıştırsanız çalışmayacak. Aslında Nix burada ilgili paketi sistemimize kuruyor ve biz terminalde nix shell komutu ile çalıştırdığımızda bizim adımıza shell içinde kurduğumuz paketleri PATH olarak tanımlıyor.
Bunu denemek için isterseniz aynı dizinde nix shell
komutundan önce cat $PATH
komutunu çalıştırın birde nix shell
komutundan sonra çalıştırın. Alttaki gibi bir satırı da listede görüyor olacaksınız.
/home/kullanici_adiniz/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7
Terminalden çıkıp tekrar girdiğimizde python2 komutunun çalıştırılmadığını görebilirsiniz. Tekrar kurulum komutu çalıştırdığınızda çok hızlı kurulduğunu görebilirsiniz. Çünkü bir çok bağımlılık zaten store'da olduğu için ilki kadar yavaş olmayacaktır.
Ayrıca Nix belirli aralıkla kendi garbage collector'ü ile sistemde kullanılmayan veya bozuk paketleri temizler.
Garbage collection'ı manuel tetiklemek için nix store gc komutu kullanılır.
# Delete unreachable paths in the Nix store:
nix store gc
# Delete up to 1 gigabyte of garbage:
nix store gc --max 1G
nix shell
komutunu alttaki gibi kullanmak da mümkün.
nix shell 'github:NixOS/nixpkgs/23.11#'{vim,tree}
Bir de nix run
komutu var bunun da yaptığı paketi kurup doğrudan çalıştırmak başka da bir alameti farikası yok. Mesela alttaki kodda doğrudan git clone komutu çalıştırılmış.
nix run nixpkgs#git clone [email protected]:ryan4yin/nix-config.git
Bu şekilde nix shell'i anlık bir şeyi test etmek için kullanabilirsiniz. Ancak tabii ki shell bu kadar değil her defasından diyelim ki projenizde gerekli 8-10 adet paketi elle kurmanız anlamsız olacaktır. Bunu da declarative yolla nix dosyasında yazarak te seferde yapmak mümkün. Bu kullanımı da sonraki makalelerimizde göreceğiz.
Profile'in shell'den farkı sistem restart olduktan sonra da paketleri saklamasıdır.
Profile'leri bir kullanıcı profili gibi düşünmemeliyiz. Daha çok sistemin belli bir stat'ini tutan bir yapıdır. Bir kullanıcının birden fazla profili olabilir. Alttaki şekil bunu çok güzel anlatmış.
Sistemde profile komutu ile her kurulum yaptığımızda state değişikliği ile bir profile oluşur. Profiller store üzeriden symbolic linklerle aynı paketin birden fazla versiyonu ile çalışabilir. Yani bir çok kullanıcı ve profile için tekrar tekrar aynı paketin kurulumu yapılmaz. Bir pakete ihtiyaç kalmadığında da garbage collection ile silinir.
Öncelikle hızlıca bir komutları inceleyelim.
- nix profile diff-closures: İki profil arasındaki farkları gösterir.
- nix profile history: profilin bütün geçmişini gösterir. Profilde her bir hareket soranı bir history kaydı oluşur.
- nix profile install: Profile paket kurar.
- nix profile list: Profildeki kurulu paketleri listeler.
- nix profile remove: Profilden paket siler.
- nix profile rollback: Özellikle belirtilmezse bir önceki versiyona geçiş yapar.
- nix profile upgrade: Paketleri en son flake versiyonuna yükseltir.
- nix profile wipe-history: Aktif olmayan yani açık oturumda kullanılmayan diğer profilleri siler.
closure: Nix closure, bir paketin bağımlılıklarıyla birlikte birleştirilmiş bir dizin yapısıdır. Bu, bir paketin tamamını ve ona bağlı tüm bağımlılıkları içerir.
Şimdide biraz alıştırma yapalım.
Şimdi de mesela NodeJs, Python ve Git kurmayı deneyelim.
nix search nixpkgs nodejs
# sonuç
# * legacyPackages.x86_64-linux.nodejs-18_x (18.19.0)
# Event-driven I/O framework for the V8 JavaScript engine
# * legacyPackages.x86_64-linux.nodejs-slim (20.10.0)
# Event-driven I/O framework for the V8 JavaScript engine
# * legacyPackages.x86_64-linux.nodejs-slim-18_x (18.19.0)
# Event-driven I/O framework for the V8 JavaScript engine
# * legacyPackages.x86_64-linux.nodejs-slim_18 (18.19.0)
# Event-driven I/O framework for the V8 JavaScript engine
# * legacyPackages.x86_64-linux.nodejs-slim_20 (20.10.0)
# Event-driven I/O framework for the V8 JavaScript engine
# * legacyPackages.x86_64-linux.nodejs-slim_21 (21.5.0)
Biz nodejs-slim_18 versiyonunu kuralım
nix profile install nixpkgs#nodejs-slim_18
nix profile install nixpkgs#python2 --impure
Öncelikle hemen ~/.nix-profile
dizinine yani aktif profile klasörümüze bi bakalım. Artık sadece manifest.json dosyamız yok. Dikkat ederseniz
ll ~/.nix-profile
dr-xr-xr-x 1 root root 250 Oca 1 1970 bin
dr-xr-xr-x 1 root root 26 Oca 1 1970 include
dr-xr-xr-x 1 root root 128 Oca 1 1970 lib
-r--r--r-- 1 root root 577 Oca 1 1970 manifest.json
dr-xr-xr-x 1 root root 30 Oca 1 1970 share
Bir de bin klasörüne bakalım. Görebildiğimiz gibi kurulumu yaptığımız NodeJs ve Python2 ile ilgili bütün binary'ler buraya sembolik link olarak bağlanmış. Aslında bütün binary ve diğer kütüphaneler store'a kaydediliyor.
ll ~/.nix-profile/bin
# total 64K
# lrwxrwxrwx 1 root root 68 Oca 1 1970 2to3 -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/2to3
# lrwxrwxrwx 1 root root 76 Oca 1 1970 corepack -> /nix/store/k748i73qqihzqc4d4671jgxx8828n06m-nodejs-slim-18.19.0/bin/corepack
# lrwxrwxrwx 1 root root 68 Oca 1 1970 idle -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/idle
# lrwxrwxrwx 1 root root 72 Oca 1 1970 node -> /nix/store/k748i73qqihzqc4d4671jgxx8828n06m-nodejs-slim-18.19.0/bin/node
# lrwxrwxrwx 1 root root 67 Oca 1 1970 pdb -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/pdb
# lrwxrwxrwx 1 root root 70 Oca 1 1970 pdb2.7 -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/pdb2.7
# lrwxrwxrwx 1 root root 69 Oca 1 1970 pydoc -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/pydoc
# lrwxrwxrwx 1 root root 70 Oca 1 1970 python -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python
# lrwxrwxrwx 1 root root 71 Oca 1 1970 python2 -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python2
# lrwxrwxrwx 1 root root 73 Oca 1 1970 python2.7 -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python2.7
# lrwxrwxrwx 1 root root 80 Oca 1 1970 python2.7-config -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python2.7-config
# lrwxrwxrwx 1 root root 78 Oca 1 1970 python2-config -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python2-config
# lrwxrwxrwx 1 root root 77 Oca 1 1970 python-config -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/python-config
# lrwxrwxrwx 1 root root 72 Oca 1 1970 smtpd.py -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/smtpd.py
# lrwxrwxrwx 1 root root 73 Oca 1 1970 smtpd.pyc -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/smtpd.pyc
# lrwxrwxrwx 1 root root 73 Oca 1 1970 smtpd.pyo -> /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7/bin/smtpd.pyo
Peki bu binary'leri nasıl kullanacağız. Yani sonuçta şuan NixOs kullanmıyorsak ve kullandığımız Linux dağıtımında da NodeJs'in farklı bir versiyonu kuruluysa sistem onu çalıştıracaktır. Bunun içinde nix shell
komutunu kullanabilir. Zaten kendi makinenizde bir Node sürümü kurulu ise terminalde nix shell nixpkgs#nodejs-slim_18
komutu ile NodeJs 18'i active edebilirsiniz. Bu durumda tekrar kurulum yapılmayacağını sadece PAth tanımlaması yapılacağını hatırlayalım.
Şimdi de Git'i kurabiliriz.
nix search nixpkgs#git
# * legacyPackages.x86_64-linux.git (2.42.0)
nix profile install nixpkgs#git
Tekrar bin dizinie bakacak olursak
ll ~/.nix-profile/bin
# sonuç
# ------------------------Kısaltıldı
lrwxrwxrwx 1 root root 62 Oca 1 1970 git -> /nix/store/31ypk253113v59lslsx8nbqpx794rlan-git-2.42.0/bin/git
lrwxrwxrwx 1 root root 79 Oca 1 1970 git-credential-netrc -> /nix/store/31ypk253113v59lslsx8nbqpx794rlan-git-2.42.0/bin/git-credential-netrc
lrwxrwxrwx 1 root root 72 Oca 1 1970 git-cvsserver -> /nix/store/31ypk253113v59lslsx8nbqpx794rlan-git-2.42.0/bin/git-cvsserver
# --------------------- Kısaltıldı
Şimdi de profile history'ye bi göz atalım. Dikkat ederseniz her kurduğumuzda profile yeni bir versiyon eklenmiş. Aktif profilimiz üzerindeki değişiklikleri listeliyor. Bu arada burada göstermiyorum ancak büyük ihtimal kendi ekranınızda listede aktif olarak kullandığınız versiyonu daha renkli göreceksiniz.
nix profile history
# sonuç
Version 1 (2023-12-08):
flake:nixpkgs#legacyPackages.x86_64-linux.hello: ∅ -> 2.12.1
Version 2 (2023-12-08) <- 1:
flake:nixpkgs#legacyPackages.x86_64-linux.mysql: ∅ -> 10.11.6, 10.11.6-man
Version 3 (2023-12-08) <- 2:
github:nixos/nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-linux.mysql: ∅ -> 10.11.6, 10.11.6-man
Version 4 (2023-12-08) <- 3:
github:nixos/nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-linux.mysql: ∅ -> 10.11.6, 10.11.6-man
Version 5 (2023-12-08) <- 4:
flake:nixpkgs#legacyPackages.x86_64-linux.mysql: 10.11.6, 10.11.6-man -> ∅
github:nixos/nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-linux.mysql: 10.11.6, 10.11.6-man -> ∅
github:nixos/nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-linux.mysql: 10.11.6, 10.11.6-man -> ∅
Version 6 (2023-12-08) <- 5:
flake:nixpkgs#legacyPackages.x86_64-linux.hello: 2.12.1 -> ∅
Version 7 (2024-01-09) <- 6:
flake:nixpkgs#legacyPackages.x86_64-linux.nodejs-slim_18: ∅ -> 18.19.0
Version 8 (2024-01-09) <- 7:
flake:nixpkgs#legacyPackages.x86_64-linux.python2: ∅ -> 2.7.18.7
Version 9 (2024-01-09) <- 8:
flake:nixpkgs#legacyPackages.x86_64-linux.git: ∅ -> 2.42.0
Sistemdeki profil listesini alalım
nix profile list
# sonuç
Index: 0
Flake attribute: legacyPackages.x86_64-linux.nodejs-slim_18
Original flake URL: flake:nixpkgs
Locked flake URL: github:NixOS/nixpkgs/24fe8bb4f552ad3926274d29e083b79d84707da6
Store paths: /nix/store/k748i73qqihzqc4d4671jgxx8828n06m-nodejs-slim-18.19.0
Index: 1
Flake attribute: legacyPackages.x86_64-linux.python2
Original flake URL: flake:nixpkgs
Locked flake URL: github:NixOS/nixpkgs/24fe8bb4f552ad3926274d29e083b79d84707da6
Store paths: /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7
Index: 2
Flake attribute: legacyPackages.x86_64-linux.git
Original flake URL: flake:nixpkgs
Locked flake URL: github:NixOS/nixpkgs/24fe8bb4f552ad3926274d29e083b79d84707da6
Store paths: /nix/store/31ypk253113v59lslsx8nbqpx794rlan-git-2.42.0
Şimdide profilden Git'i silelim. Bunun için Nix listesindeki Store path adresini kullanıyoruz.
nix profile remove /nix/store/31ypk253113v59lslsx8nbqpx794rlan-git-2.42.0
Şimdi listeye bir bakalım
nix profile list
Index: 0
Flake attribute: legacyPackages.x86_64-linux.nodejs-slim_18
Original flake URL: flake:nixpkgs
Locked flake URL: github:NixOS/nixpkgs/24fe8bb4f552ad3926274d29e083b79d84707da6
Store paths: /nix/store/k748i73qqihzqc4d4671jgxx8828n06m-nodejs-slim-18.19.0
Index: 1
Flake attribute: legacyPackages.x86_64-linux.python2
Original flake URL: flake:nixpkgs
Locked flake URL: github:NixOS/nixpkgs/24fe8bb4f552ad3926274d29e083b79d84707da6
Store paths: /nix/store/a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7
Bir de history'ye bakalım. Dikkat ederseniz 2.42.0 -> ∅
diye bir tanım var. Bu da Git'in kaldırıldığını gösteriyor.
nix profile history
# ----------------- kısaltıldı
Version 10 (2024-01-09) <- 9:
flake:nixpkgs#legacyPackages.x86_64-linux.git: 2.42.0 -> ∅
Şimdi profilimizdeki bir versiyonu geri yükleyelim mesela amacımız Python'ın yüklenmediği ve onun üzerine GoLang'ın kurulduğu bir durum olsun. Bu bende history'dei 6 numaralı versiyon. Sizde farklı olabilir.
nix profile rollback --to 6
tekrar history'ye bakacak olursanız üzerinde olduğunuz versiyonun aktif olduğunu göreceksiniz.
Şimdi tam buradayken GoLang'ı kurup bir de history'ye öyle bakalım. Öncelikle GoLang'ı arayalım sonrada kuralım.
nix search nixpkgs#go
# * legacyPackages.x86_64-linux.go (1.21.5)
# The Go Programming language
nix profile install nixpkgs#go
Şimdi history'ye bakalım
nix profile histrory
# -------------------- kısaltıldı
# Version 6 (2023-12-08) <- 5:
# flake:nixpkgs#legacyPackages.x86_64-linux.hello: 2.12.1 -> ∅
# Version 7 (2024-01-09) <- 6:
# flake:nixpkgs#legacyPackages.x86_64-linux.nodejs-slim_18: ∅ -> 18.19.0
# Version 8 (2024-01-09) <- 7:
# flake:nixpkgs#legacyPackages.x86_64-linux.python2: ∅ -> 2.7.18.7
# Version 9 (2024-01-09) <- 8:
# flake:nixpkgs#legacyPackages.x86_64-linux.git: ∅ -> 2.42.0
# Version 10 (2024-01-09) <- 9:
# flake:nixpkgs#legacyPackages.x86_64-linux.git: 2.42.0 -> ∅
# Version 11 (2024-01-10) <- 10:
# flake:nixpkgs#legacyPackages.x86_64-linux.go: ∅ -> 1.21.5
# flake:nixpkgs#legacyPackages.x86_64-linux.hello: ∅ -> 2.12.1
# flake:nixpkgs#legacyPackages.x86_64-linux.nodejs-slim_18: 18.19.0 -> ∅
# flake:nixpkgs#legacyPackages.x86_64-linux.python2: 2.7.18.7 -> ∅
Yeni eklenen ve bende aktif olan versiyon 11'de Go'nun kurulduğunu ve versiyon 6'da iken kurulum yaptığımız için aradaki NodeJs ve Python2'nin silindiğini görebilirsiniz.
Hatta bunu profilimizdeki bin klasöründen de test edelim. Göreceğiniz üzere profilimizden silinmiş.
ll ~/.nix-profile/bin
total 12K
lrwxrwxrwx 1 root root 60 Oca 1 1970 go -> /nix/store/6qd8p8gilzgplpk2ni3109m0k71r21s7-go-1.21.5/bin/go
lrwxrwxrwx 1 root root 63 Oca 1 1970 gofmt -> /nix/store/6qd8p8gilzgplpk2ni3109m0k71r21s7-go-1.21.5/bin/gofmt
lrwxrwxrwx 1 root root 66 Oca 1 1970 hello -> /nix/store/sbldylj3clbkc0aqvjjzfa6slp4zdvlj-hello-2.12.1/bin/hello
Şimdi birde store'a bakalım. Profilimizden gitmiş olamsına rağmen halen Python2'nin halen store'da olduğunu görebiliriz. Bunun birkaç sebebi olabilir
- Başka bir kullanıcı bu versiyonu kullanıyor olabilir.
- Sistem kulalnıyor olabilir. Yanibir paket için belki bu versiyon gereklidir.
- Garbage collection henüz çalışmamış olabilir.
- Son olarak yukardakiler olmasa bile bizim profile'de bir versiyonu kullanıyor olabiliriz.
ll /nix/store/ | grep python-2
dr-xr-xr-x 1 root root 58 Oca 1 1970 a55nhyb3n13bdx1swv5dz3zm3lhikmfd-python-2.7.18.7
-r--r--r-- 1 root root 7,9K Oca 1 1970 rfnbbfml49p3lmh92jd3mlqzjq1fg6aj-python-2.7.18.7.drv
Bu durumda bize son madde uygun görünüyor yani bizim profilimizde history'de Python2 kurulu görünüyor. O zaman iddiamıza göre history'yi temizler ve garbage collertor'ü de çalıştıracak olursak hakiakten Python2'nin silindiğini görmemiz gerekiyor.
# aktif olamayan bütün history'leri silelim
nix profile wipe-history
# garbage collector'ü çalıştıralım
nix store gc
# store'a bakalım
ll /nix/store/ | grep python-2
Sonuçta Python2'nin silindiğini gördük.
Son olarak herhangi bir paketi veya bütün paketleri upgrade etmek için de nix profile upgrade
komutu kullanılır.
nix profile upgrade '.*'
nix profile upgrade packages.x86_64-linux.hello
nix profile upgrade 0 # profile idex numarası
Evet profile için de bu kadar yeterli. Tabi profilleri de declarative yolla yani bir nix dosyasıyla kullanmak mümkün bunu da bir sonraki makalelerimizde göreceğiz.
- nix run: Uygulamayı build alır ve çalıştırır. Mesela flake ile bir derivative yazdık ve çalıştırmak isityoruz diyelim. packages.<system>.default komutu ie çalıştırabiliriz. veya hali hazırda nixpkgs içindeki bir uygulamayı çalıştırmak için packages.<system>.<name>
- nix search: Paket aramak için kullanılır.
- nix copy: Store içindeki dosya ve klasörleri kopyalamak için kullanılır.
- nix edit: Nix paketini düzenlemek için kullanılır.
- nix store add: Bir dizini Nix Store'a ekler.
- store add --mode flat: Bir dosyayı store'a ekler.
- nix store cat: Nix deposundaki bir dosyanın içeriğini stdout'a yazdırır. Linux^daki cat komutu gibi.
- nix store delete: Nix Store'dan bir dizin veya klasörü siler.
- nix store diff-closures: iki Nix kapanışı (closure) arasındaki farkları gösterir. Nix closure, bir paketin bağımlılıklarıyla birlikte birleştirilmiş bir dizin yapısıdır. Bu, bir paketin tamamını ve ona bağlı tüm bağımlılıkları içerir.Komutun temel amacı, iki closure arasındaki paket ve sürüm farklarını belirlemektir. Yani, bir paketin bir versiyonundan diğerine veya bir kapanıştan diğerine hangi paketlerin eklenip kaldırıldığını gösterir. Bu bilgi, paketlerin ve bağımlılıklarının güncellenmesi veya değiştirilmesi durumlarında faydalı olabilir.
- nix store dump-path: Bir store yolunu NAR formatında stdout'a serileştirir.
- nix store gc: Nix Store'daki gereksiz dosyaları temizler.
- nix store info: Store hakkında bilgi verir
- nix store ls - Nix store'daki bir yol hakkında bilgi göster. Linux'deki ls komutu gibi.
- nix store ping: Bir store'a erişilebilir mi diye test eder. Buna uzak store'larda dahil. örneğin
nix store ping --store https://cache.nixos.org
- nix store prefetch-file: Bir dosyayı Nix Store'a indirir.
- nix registry add: - add/replace flake in user flake registry
- nix registry list: - list available Nix flakes
- nix registry pin: - pin a flake to its current version or to the current version of a flake URL
- nix registry remove: - remove flake from user flake registry
- nix upgrade-nix: nix paket yöneticisini stabil en son sürüme upgrade etmek için kullanılır. Bunu ayrıca sadece tek bir profile için yapmak da mümkün. örneğin
nix upgrade-nix --profile ~alice/.local/state/nix/profiles/profile
. - nix why-depends: Bir paketin diğer bir pakete neden bağlı olduğu araştırmak için kullanılır
örneğin altta thunderbird ile glib arasındaki bağımlılık araştırılmıştı.
nix why-depends --all nixpkgs#thunderbird nixpkgs#glib
# Sonuç
/nix/store/97i88qcprk3ylam7b2ppkr94yj5hxm0r-thunderbird-115.6.0
└───/nix/store/pag0sz7012misn9pckd6my9gvayl5q9h-xdg-utils-unstable-2022-11-06
└───/nix/store/7m55djnyz4x0lcffn6c38j57bzpj1a6g-glib-2.78.1-bin
Bu makalemiz de bu kadar. Bir sonraki makalemizde Nix Flake kavramını detaylı olarak inceleyeceğiz. Devam edebilmemiz için artık Flake'i anlamamız gerekiyor.