Nix Paket Yöneticisi Shell, Profile Kavram ve Komutları

Murat Çabuk
Devops Türkiye☁️ 🐧 🐳 ☸️
12 min readMar 27, 2024

--

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.

  1. NixOS: İşletim Sistemlerine Fonksiyonel Yaklaşım
  2. Nix Dili ve Özellikleri
  3. Nix Dili ile ilgili Alıştırmalar
  4. Nix Dilinde Builtins Fonksiyonlar
  5. Nix Paket Yöneticisi
  6. Nix Paket Yöneticisi Shell, Profile Kavram ve Komutları
  7. Nix Flake Nedir?
  8. Birden Çok Paketi Aynı Repo Üzeriden Yayınlamak
  9. Nix Paket Yöneticisinde Override ve Overlay Kavramları
  10. Nix Paket Yöneticisi ile Developmen Ortamları ve Profile Oluşturmak
  11. Nix ile NixOs Konfigürasyonu
  12. NixOs Module ve Option Kullanımı
  13. NixOs Kurulumu ve Konfigürasyonu
  14. NixOs’u Cloud ve Uzak Ortamlara Deploy Etmek

Nix Shell ve Nix Run Kullanımı

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 git@github.com: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.

Nix Profile Kullanımı

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ış.

Resim Kaynak

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

Diğer Temel Bazı Komutlar

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

Originally published at https://github.com.

Kaynaklar

--

--