presentation-nix-flakes/sigma.md

4.9 KiB

marp class paginate footer
true invert true 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ů:

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:

nix shell nixpkgs#alejandra
nix shell github:kamadorueda/alejandra

Zobrazení atributů flaky:

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:

{
  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:

{
  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:

{
  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:

nix flake init --template templates#full

Zobrazení vstupů:

nix flake metadata --json | jq

Aktualizace vstupů:

nix flake update # všechny vstupy
nix flake update home-manager # konkrétní vstup

7. Nixos-rebuild a vzdálené buildy

Lokální rebuild:

nixos-rebuild --flake .
nh os switch

Manuální přepnutí konfigurace:

nix build /etc/nixos#nixosConfigurations.nixos.config.system.build.toplevel
./result/bin/switch-to-configuration switch

Vzdálený build:

nixos-rebuild --target-host nixFreak@192.168.8.32 switch --flake .#default

8. Nix Shell a DevShells

Příklad shell.nix:

{pkgs ? import <nixpkgs> {}}:
pkgs.mkShell {
  packages = [ pkgs.cowsay ];
}

Příklad flaky pro vývojové prostředí:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };
  outputs = { self, nixpkgs }: {
    devShells.default = nixpkgs.mkShell {
      packages = [ nixpkgs.cowsay ];
    };
  };
}

9. Nix Language

Deklarace setu:

foo = {
  bar = "test";
};
foo.bar # "test"

Funkce v Nix:

let
  addOne = eggs: eggs + 1;
in
  addOne 3 # -> 4

10. Nix Writers

  • Jednoduché přidávání skriptů do systému

Příklad:

pkgs.writers.writeBash "hello-world" {} ''
echo "Hello, world!"
'';

Příklad s Python knihovnami:

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!