--- marp: true class: invert paginate: true footer: "Albert Vala, Filip Kohout, Nix flakes & Nix command" --- # Nix flakes & Nix command --- # Nix Command * Nové CLI pro Nix * Podpora Flakes --- # Porovnání ```shell nix-shell -p cowsay #Old nix shell nixpkgs#cowsay #New nix run nixpkgs#cowsay #New ``` --- # Příkazy | Command | Na | | -------------- | ---------------------------------- | | `flake new` | Vytvoření flaky z template | | `develop` | Build environment shell | | `shell` | temp shell s nějakým programem | | `config check` | Check configu na potenciální chyby | | `run` | Spustí output z flaky | --- # 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 --- # Nix command + flakes - dočasný shell ```shell nix shell nixpkgs#alejandra nix shell github:kamadorueda/alejandra ``` - zobrazení atributů ```shell nix flake show github:kamadorueda/alejandra ``` --- # Jak použít flakes na systémovou configuraci? * Flakes používáme jen na správu input a output atributů * Zbytek konfigurace používá inputy definované ve flake.nix --- ```nix # flake.nix { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; zen-browser.url = "github:0xc000022070/zen-browser-flake"; }; outputs = inputs @ { nixpkgs, home-manager, zen-browser, ... }: { 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.extraSpecialArgs = {inherit zen-browser;}; home-manager.users.nixFreak = import ./home.nix; } ]; }; }; }; } ``` --- ```nix # home.nix { zen-browser, config, pkgs, ... }: { home.username = "nixFreak"; home.homeDirectory = "/home/nixFreak"; home.stateVersion = "24.05"; home.packages = with pkgs; [ cowsay ] ++ [ zen-browser.packages."${system}".default ]; programs.home-manager.enable = true; } ``` --- ```nix # configuration.nix { config, lib, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; users.users.nixFreak = { isNormalUser = true; extraGroups = ["wheel"]; }; system.stateVersion = "25.05"; } ``` --- # Inputs * `nix flake metadata --json | jq` - zobrazí vstupy * lock aktuální verze * `nix flake update` - aktualizace všech vstupů * `nix flake update [home-manager]` - aktualizace jednoho vstupu ```nix inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; nixpkgs-current = "github:nixos/nixpkgs?ref=3058cf84bce1aba7b1820cb24319a171572217ba-dirty"; } ``` --- # Nixos-rebuild - Je to jen bash script ```shell nixos-rebuild --flake nh os switch ``` ```shell nix build /etc/nixos#nixosConfigurations.nixos.config.system.build.toplevel ./result/bin/switch-to-configuration switch ``` --- # Remote building * `nixos-rebuild --target-host nixFreak@192.168.8.32 switch --flake .#default` * `--use-remote-sudo` * `--build-host` - konfigurace bude použita na tomto zařízení * `--target-host` - konfigurace bude použita na cíleném zařízení * `nix.settings.trusted-users` --- # Virtual machine * `nix run github:nix-community/nixos-generators -- -c ./flake.nix --flake '#default' -f vm --disk-size 20480` * `nixos-rebuild build-vm --flake ~/my-system-flake#default` * možnost generovat pro různé platformy (Amazon E2C, Docker, ISO, Proxmox, VMware, vagrant, qcow, ...) * [https://github.com/nix-community/nixos-generators](https://github.com/nix-community/nixos-generators) --- # Nix Shell - `nix-shell ./` ```nix # shell.nix {pkgs ? import {}}: pkgs.mkShell { packages = [ (pkgs.python311.withPackages(pypkgs: with pypkgs; [ requests numpy pygobject3 ])) ] } ``` --- ```nix #flake.nix { inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; }; in with pkgs; { devShells.default = mkShell { packages = [ (pkgs.python311.withPackages (pypkgs: with pypkgs; [ requests numpy pygobject3 ])) ]; }; } ); } ``` --- # Nix language * `nix-repl` nebo `nix-instantiate --eval foo.nix` ```nix # Deklarace setu foo = { bar = "test" } # "Čtení" setu (evaluation) foo.bar # Let-In syntaxe let foo = { bar = "test" }; in foo.bar ``` --- ```nix # Rekurze foo = rec { bar = 10; ham = 5; eggs = bar + ham; } ``` ```nix # Použití with environment.systemPackages = with pkgs; [ neovim wireshark ]; ``` --- ## Funkce ```nix # Jednoduchá funkce let bar = eggs: eggs + 1; in bar 3 # -> 4 # Funkce s více parametry let bar = eggs: bacon: (eggs+1) * bacon; in bar 3 7 # -> 28 ``` --- ```nix let bar = { bacon, eggs }: bacon + eggs; in bar { bacon = 10; eggs = 15; } ``` * konfigurační soubory jsou funkce ```nix # configuration.nix {inputs, pkgs}: { environment.systemPackages = [ inputs.zen-browser.packages.${system}.default pkgs.gcc ]; } ``` --- ```nix let bar = { bacon ? 10, eggs, ... }: bacon + eggs; in bar { eggs = 15; bread = 30 } ``` ```nix let bar = { bacon ? 10, ... }@arguments: bacon + arguments.eggs; in bar { eggs = 15; bread = 30; } ``` --- ```nix outputs = inputs @ { nixpkgs, home-manager, zen-browser, ... }: { nixosConfigurations = { nixos = nixpkgs.lib.nixosSystem { ... ``` --- # Jak zabalit aplikaci do flake? --- ```nix outputs = {self, ...} @ inputs: let supportedSystems = ["aarch64-linux" "i686-linux" "x86_64-linux"]; forAllSystems = inputs.nixpkgs.lib.genAttrs supportedSystems; nixpkgsFor = forAllSystems (system: import inputs.nixpkgs {inherit system;}); in { packages = forAllSystems (system: let pkgs = nixpkgsFor.${system}; in { default = self.packages.${system}.nix-install; nix-install = pkgs.writeShellApplication { name = "nix-install"; runtimeInputs = with pkgs; [git busybox gum]; text = '' echo "This is shell aplication in flake" ''; }; }); apps = forAllSystems (system: { default = self.apps.${system}.nix-install; nix-install = { type = "app"; program = "${self.packages.${system}.nix-install}/bin/nix-install"; }; }); }; ``` --- ```shell ├───apps │ ├───aarch64-linux │ │ ├───default: app │ │ └───nix-install: app │ ├───i686-linux │ │ ├───default: app │ │ └───nix-install: app │ └───x86_64-linux │ ├───default: app │ └───nix-install: app └───packages ├───aarch64-linux │ ├───default: package 'nix-install' │ └───nix-install: package 'nix-install' ├───i686-linux │ ├───default: package 'nix-install' │ └───nix-install: package 'nix-install' └───x86_64-linux ├───default: package 'nix-install' └───nix-install: package 'nix-install' ``` --- * spuštění aplika e pomocí `nix run` * `https://github.com/nixFreak/testApp` * `nix run github:nixFreak/testApp` * nebo přidání do flake inputů ```nix environment.systemPackages = [ inputs.install-script.packages.${system}.default inputs.zen-browser.packages.${system}.default ]; ``` --- # Nix writers * Jednoduchý způsob přidávání skriptů v různých programovacích jazycích do systému * Rozdíl oproti klasickému `pkgs.writeShellScriptBin` či balíčkovaání skriptu do derivace * [nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/writers/scripts.nix) - pro všechny možnosti konfigurace skriptů * [https://nixos.wiki/wiki/Nix-writers](https://nixos.wiki/wiki/Nix-writers) - wiki --- ```nix pkgs.writers.writeBash "hello-world-bash" {} '' echo "Hello world!" '' pkgs.writers.writePython3 "hello-world-python" {} '' print("Hello world!") '' pkgs.writers.writeRust "hello-world-rust" {} '' fn main() { println!("Hello world!") } '' ``` --- ```nix pkgs.writers.writePython3 "hello-world-python" { libraries = [ pkgs.python3Packages.requests ]; makeWrapperArgs = [ "--prefix", "PATH", ":", "${pkgs.sl}/bin", ]; } '' print("Hello world!") '' ``` --- # Rozumíte? --- ```nix { inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; zen-browser.url = "github:0xc000022070/zen-browser-flake"; }; outputs = inputs @ { nixpkgs, home-manager, zen-browser, ... }: { 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.extraSpecialArgs = {inherit zen-browser;}; home-manager.users.nixFreak = import ./home.nix; } ]; }; }; }; } ``` --- * # [EWW Flake](https://github.com/elkowar/eww/blob/master/flake.nix) * # `nix flake init --template templates#full` * # [Vimjoyer](https://www.youtube.com/@vimjoyer) --- # **Používejte Nix!**