--- marp: true class: invert paginate: true footer: "Albert Vala, Filip Kohout, Nix flakes & Nix command" --- # Nix Flakes & Nix Command --- # 1. Úvod do Nix Command - Nové rozhraní pro příkazovou řádku Nix - Podpora pro Flakes ## Porovnání starých a nových příkazů: ```shell nix-shell -p cowsay # Starý způsob nix shell nixpkgs#cowsay # Nový způsob nix run nixpkgs#cowsay # Nový způsob ``` --- # 2. Základní příkazy Nix CLI | Příkaz | Popis | |---------------|----------------------------------------| | `flake new` | Vytvoření flake z šablony | | `develop` | Build environment shell | | `shell` | Dočasný shell s vybraným programem | | `config check`| Kontrola konfigurace na chyby | | `run` | Spuštění výstupu z flaky | --- # 3. Úvod do Nix Flakes ### Proč Flakes? - Použití `lockfiles` pro deterministické buildy - Jednoduchá správa vstupů (flake inputs) ### Na co lze Flakes použít? - Správa systémové konfigurace - Vývojové prostředí - Balíčkování - Nástroje pro deployment --- # 4. Použití Nix Command + Flakes ## Dočasný shell s balíčkem: ```shell nix shell nixpkgs#alejandra nix shell github:kamadorueda/alejandra ``` ## Zobrazení atributů flaky: ```shell nix flake show github:kamadorueda/alejandra ``` --- # 5. Použití Flakes pro systémovou konfiguraci - Flakes spravují pouze `inputs` a `outputs` - Konfigurace systému je definována v `flake.nix` ## Příklad `flake.nix`: ```nix { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { nixpkgs, home-manager, ... }: { nixosConfigurations = { nixos = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ ./configuration.nix home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = false; home-manager.useUserPackages = true; home-manager.users.nixFreak = import ./home.nix; } ]; }; }; }; } ``` --- ## Příklad `home.nix`: ```nix { config, pkgs, ... }: { home.username = "nixFreak"; home.homeDirectory = "/home/nixFreak"; home.stateVersion = "24.05"; home.packages = with pkgs; [ cowsay ]; programs.home-manager.enable = true; } ``` --- ## Příklad `configuration.nix`: ```nix { config, lib, pkgs, ... }: { imports = [ ./hardware-configuration.nix ]; boot.loader.systemd-boot.enable = true; users.users.nixFreak = { isNormalUser = true; extraGroups = ["wheel"]; }; system.stateVersion = "25.05"; } ``` --- # 6. Správa Flakes ### Vytvoření nové flaky: ```shell nix flake init --template templates#full ``` ### Zobrazení vstupů: ```shell nix flake metadata --json | jq ``` ### Aktualizace vstupů: ```shell nix flake update # všechny vstupy nix flake update home-manager # konkrétní vstup ``` --- # 7. Nixos-rebuild a vzdálené buildy ## Lokální rebuild: ```shell nixos-rebuild --flake . nh os switch ``` ## Manuální přepnutí konfigurace: ```shell nix build /etc/nixos#nixosConfigurations.nixos.config.system.build.toplevel ./result/bin/switch-to-configuration switch ``` ## Vzdálený build: ```shell nixos-rebuild --target-host nixFreak@192.168.8.32 switch --flake .#default ``` --- # 8. Nix Shell a DevShells ## Příklad `shell.nix`: ```nix {pkgs ? import {}}: pkgs.mkShell { packages = [ pkgs.cowsay ]; } ``` ## Příklad flaky pro vývojové prostředí: ```nix { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs }: { devShells.default = nixpkgs.mkShell { packages = [ nixpkgs.cowsay ]; }; }; } ``` --- # 9. Nix Language ## Deklarace setu: ```nix foo = { bar = "test"; }; foo.bar # "test" ``` ## Funkce v Nix: ```nix let addOne = eggs: eggs + 1; in addOne 3 # -> 4 ``` --- # 10. Nix Writers - Jednoduché přidávání skriptů do systému ## Příklad: ```nix pkgs.writers.writeBash "hello-world" {} '' echo "Hello, world!" ''; ``` ## Příklad s Python knihovnami: ```nix pkgs.writers.writePython3 "hello-world" { libraries = [ pkgs.python3Packages.requests ]; } '' import requests print("Hello, world!") ''; ``` --- # Závěr - Nix Flakes usnadňují správu závislostí a buildů - `nix` CLI přináší nové možnosti - Flakes umožňují snadnou replikaci prostředí **Děkujeme za pozornost!**