Passer a NixOS ..concretement

Bonjour a tous/toutes,

utilisateur de Debian depuis pas loin de 30 ans j’envisage de passer sous NixOS pour cloisonner mes environnements de dev avec

  • java
  • scala
  • haskell

Je commence a comprendre le concept NixOS avec les env..Je n’ai pas encore creuse les flakes…

Mais avant d’effacer ma Debian de mon framework 13 j’aimerais savoir quelles recommandations faire sur les packages “systeme” (je pense qu’il ne faut pas en installer trop) et ce que je dois deporter vers les environnements deportes…

Pour illustrer ma question je fais mes slides sous emacs avec org-mode et beamer ..Dois je installer tout cela dans les packages systemes (avec des curl/wget/htop et autres)?

Comment traiter les configs du type Doom/Emacs ou oh-my-zsh ?

Par avance merci

Jerome

J’imagine qu’il n’y a pas une seule réponse, mais personnellement j’ai tendance à installer globalement tous les paquets que j’utilise régulièrement (curl, wget, htop en faisant partie, mais également latex pour articles et slides beamer) comme sur une distrib traditionnelle, je fais des nix-shell -p monpaquet quand c’est une commande que je tape rarement pour pas installer durablement des trucs inutiles, et pour les projets de dev dont j’ai envie de pin toutes les dépendances pour la reproducibilité j’utilise un shell.nix ou mieux un flake.nix combiné avec direnv (et emacs direnv) pour le charger tout seul quand je change de dossier. Il faut juste avoir à l’esprit que vu que le loader /lib/…linux….so n’existe pas par défaut, NixOs ne peut pas lancer des exécutables non compilés pour nixos et plein d’environements de dev téléchargent des binaires allégrement (java, npm…) et c’est vite un casse tête pour développer (on n’a pas toujours le temps de packager toutes les dépendances d’un projet…) . Pour éviter ces soucis je charge aussi le module nix-ld (avec un paquet de lib, cf la page wiki que j’avais créee Nix-ld - Official NixOS Wiki et des posts stack exchange où j’ai mis la liste) qui re-créé le loader et te remet (presque) dans un système linux traditionnel pour faire des choses quick and dirty.

Ah et pour emacs (et zfs/fish/git…) j’utilise home-manager pour installer les paquets/modes, et un init.el classique configuré dans le paquet pour ma config mais c’est juste car j’aime bien une config déterministe, tu peux toujours faire comme tu fais actuellement. J’avais essayé doom à un moment et je n’avais pas eu de soucis particulier (je le laissait ptet gérer tout seul ses dépendances par contre comme sur un syrtème traditionnel), y’a ptet d’autres méthodes.

Bonjour Jérôme,

Pour compléter ce que dit tobiasBora, voici un exemple concret de flake - y compris les trois environnements:

{
description = “Config NixOS de Jerome”;

inputs.nixpkgs.url = “github:NixOS/nixpkgs/nixos-unstable”;
inputs.home-manager.url = “github:nix-community/home-manager”;

outputs = { self, nixpkgs, home-manager }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
  nixosConfigurations.framework = nixpkgs.lib.nixosSystem {
    system = "x86_64-linux";
    modules = [ ./configuration.nix ];
  };

  # Home-manager (Emacs, zsh, etc.)
  homeConfigurations.jerome = home-manager.lib.homeManagerConfiguration {
    inherit pkgs;
    modules = [ ./home.nix ];
  };

  # Environnements de dev
  devShells.x86_64-linux = {
    java    = pkgs.mkShell { packages = [ pkgs.jdk21 pkgs.maven ]; };
    scala   = pkgs.mkShell { packages = [ pkgs.scala_3 pkgs.sbt pkgs.metals ]; };
    haskell = pkgs.mkShell { packages = [ pkgs.ghc pkgs.cabal-install pkgs.haskell-language-server ]; };
  };

};

}

nix develop .#scala pour entrer dans l’env Scala, etc. Avec direnv c’est automatique.

Tu peux aussi regarder des configs sur Codeberg/Github etc pour t’inspirer.

J’étais pas non plus ancré total comme toi.: J’ai été uilisateur Debian, puis Ubuntu, puis Debian+Ubuntu pendant moins longtemps… en gros 10/15 ans, mais graduellement parce que j’étais 100% windows de 1995 à 2005 en gros, debian ubuntu de 2003 à 2017, full linux depuis 2010 en config personnel, donc

Je suppose que tu étais sur le forum debian-fr ? J’aimais bien ce site. Attention je te raconte un peu ma life dans le thread :wink:

Pour passer à Nixos, j’ai eu une période d’adaptation, que je pense on peut raccourcir. Mais j’avais juste installé nix (pas nixos) comme package manager supplémentaire sur mes Ubuntu/Debian
cf:

sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --daemon

Ca permet de s’habituer à la syntax du language nix, et defaire des dérivations locales. En gros se mouiller sans se mouiller trop fort non plus: tout le reste de la config reste comme d’hab
On peut faire vraiment pas mal de truc. Tu peux commencer à importer tes propres fichiers nix, avec tes propres fonctions… et complexifier au fur et à mesure en restant à ton niveau de compréhension

Je dis cela, parce que dans mon cas, j’aurais VRAIMENT pas pu faire tout ce que je veux du premier coup avec NixOS. A commencer par fluxbox peut etre, je sais plus. Y’a un vrai temps d’adaptation. Comprendre comment et à quel point tout est declaratif… les implications que ça change etc… genre si tu édites en barbare un fichier system à la mano, oublie tout de suite: ta modif sera plus tard réécrasée sans scrupules par une generation NixOS.

Je te donne que mon point de vue: j’ai pris l’optique de partir d’un NixOs barebone, et d’y ajouter que ce que je savais faire. Du coup ça prend du temps.

Si tu te bases que sur les config des autres pour faire des trucs chiadés, bah tu vas avoir du code qui va te sembler complexe, ne pas le maitriser, et donc ne pas être capable de l’adapter soit quand t’as un problème ou pour l’adapter à ton vrai use-case: en tout cas ça se serait passé comme cela pour moi je pense - c’est mon cas personnel

Le benefice: t’as pas idée de la dinguerie de la puissance de ce que tu peux configurer une fois que tu es dans le bain… ni du comfort et du sentiment de surêté/sécurité quand à la stabilité de ton installation… C’est vraiment… indicible… vraiment!

J’aurais tendance à penser qu’il faut accepter de pas pouvoir tout avoir tout ce que tu veux du premier coup… et dans les mois qui viennent au fur et à mesure: améliorer ta config dans la mesure de ce que tu comprends et apprends

C’est “ma” technique :-)… maintenant si tu le sens: plonge!

Pour Oh-My-Zsh, tu peux le faire avec home-manager, qui te permet de générer ce que tu désire dans tes dotfiles et dotconfig à la manière de NixOS. Par défaut c’est pas du tout le cas: Ton home est totalement ton home → zero NixOS.

C’est tout récent que j’ai mis mon vim et mon neovim dans home-manager… Je regrette d’avoir mis si longtemps… c’est pas si compliqué finalement. Mais j’aurais peut etre eu du mal à séparer les deux dans mon esprit NixOS et home-manager, si j’avais utilisé les deux dès le debut.

Je regarde vite pour emacs, dans home-manager y’a cela:

       programs.emacs.package
           The emacs package to use.

           Type: package

           Default: pkgs.emacs

           Example: pkgs.emacs25-nox

           Declared by:
               <home-manager/modules/programs/emacs.nix>

       programs.emacs.extraConfig
           Configuration to include in the Emacs default init file. See https://www.gnu.org/software/emacs/manual/html_node/elisp/Init-File.html[1] for more.

           Note, the ‘inhibit-startup-message’ Emacs option cannot be set here since Emacs disallows setting it from the default initialization file.

           Type: strings concatenated with “\n”

           Default: ""

           Example:

               ''
                 (setq standard-indent 2)
               ''

           Declared by:
               <home-manager/modules/programs/emacs.nix>

            1. https://www.gnu.org/software/emacs/manual/html_node/elisp/Init-File.html

       programs.emacs.extraPackages
           Extra packages available to Emacs. To get a list of available packages run: nix-env -f '<nixpkgs>' -qaP -A emacsPackages.

           Type: Function that takes an attribute set and returns a list containing a selection of the values of the input set

           Default: "epkgs: []"

           Example: epkgs: [ epkgs.emms epkgs.magit ]

           Declared by:
               <home-manager/modules/programs/emacs.nix>

Donc tu devrais pouvoir configurer pas mal emacs… mais j’ai stoppé monapprentissage d’emacs y’a quelquemois, du coup… je peux pas garantir que si tu mets le package nixpkgs doomemacs dans extrapackage, que bah ça va marcher… je sais pas: faudrait que tu confirme avec quelqu’un qui l’utilise ainsi: home-manager + emacs + org / doomemacs

Peut etre en posant la question aux anglophones t’aura plus de réponses d’utilisateurs quotidiens

Bonsoir a tous,

merci pour vos réponses autant pour leur rapidité que pour leur qualité (le top le .flake)..

Oui je vais renoncer a quelques trucs au départ (bspwm,peut être la config doom emacs et zsh) mais je vais essayer d’y aller step by step et je pense que le jeu en vaut la chandelle…

Je vais tenter des trucs ,me tromper et recommencer….

Cette communauté vaut le détour….

Merci encore et sûrement a bientôt

Jerome

2 Likes

C’est la bonne chose d’y aller graduellement, mais pour emacs/zsh/… tu peux vraiment les utiliser comme actuellement pour ne pas trop te perturber. Tu pourras utiliser home-manager pour passer à une config déclarative plus tard (et c’est vraiment optionnel). Et pour bspwm tu as une option pour l’activer et configurer comme les autres systèmes donc ça doit bien se faire aussi j’imagine ^^ NixOS Search

1 Like

Je plussoie tobias. Sinon auussi, tout petit détail (je pense qu’il est tellement évident que le gens insiste pas trop dessus): mets ton fichier configuration.nix (et accessoirement hardware.nix) sous git. C’est comme un filet de secours supplémentaire.

Cela te permet de sauvergarder ta configuration toute entière en mode texte/code. Les generations NixOS sont le fruit d’un configuration.nix qui est compilé par la command nixos-rebuild. De base tu peux switcher, rollback etc… entre les differentes générations que tu compiles au fur et à mesure du temps. Mais le fichier configuration.nix n’est pas historisé par NixOS: ce sont les generations qui sont historisées. Une fois que t’as ton configuration.nix sous version control… bah tu peux toujours revenir à un configuration.nix que tu as git commit.

Autre avantage de mettre ton configuration.nix sous git => bah t’as plus peur d’essayer des trucs… Si ca marche pas ou que tu butes/bloques sur un truc que tu comprends pas… t’as biensûr le rollback NixOS pour revenir à une génération qui fonctionnait avant… ou alors t’as ton git pour lancer un nixos-rebuild sur un configuration.nix que tu aimais bien.

Du coup moi perso… ce rollback NixOS je l’ai utilisé seulement que quelquefois quand j’ai fait vraiment vraiment vraiment vraiment portenawak et que j’avais pas trop commit mon fichier configuration.nix . Cela participe au sentiment de stabilité.

Sinon comme dit @tobiasBora, comme par défaut ton home c’est ton home… rien ne t’empeche d’avoir ton propre zshrc. zsh je l’ai sous home-manager. Mais mon bashrc, comme je le modifie plusieurs fois par jour, et même parfois par heure… je l’ai encore en manuel dans mon home, comme avant sous debian/ubuntu, avec mon propre generateur de bashrc.

Avoir le bashrc/zshrc sous home-manager rend le fichier rc généré read-only ( il fait alors partie d’une dérivation nixos dans le nix-store comme tous le reste de ta configuration, tes programmes)… et ça rend l’édition à la volée un tout petit peu plus lente (parce que tu dois alors regenerer tes dotfiles avec home-manager à chacune de tes modifications dans le temps). Avec mon bashrc en manuel et mon zsh en home-manager j’ai les deux approches. Mais bon je reste encore plus un utilisateur bash que zsh aussi…

EDIT: et pour haskell, j’utilise uniquement le système de packaging nixos. J’utilise pas cabal et stack. Donc j’ai pas une utilisation aussi pointue que toi. Ce que m’offre NixOS me suffit. Il me semble bien que les fois où j’ai utilisé cabal sous nixos, ça a bien fonctionné (avec un tout petit ajout au fichier cabal pour qu’il s’integre dans nixos il me semble), mais j’aime tellement la pureté NixOS, que j’ai tendance à pas utiliser ce qui n’adhère à fond pas à cette philosophie. cabal et stack travaillent avec le home, et laisse une trace dans le temps.

Donc je me suis limité au versionning imposé par nixpkgs, et les packages haskell qui y sont présent. Ca me limite pas pour mon utilisation. Je fais pareil pour python: pour l’instant je n’ai pas fait le pas d’utiliser pip uv poetry. Je doute pas que ça marche… c’est juste que c’est pas encore ma démarche pour l’instant.

1 Like

Pendant que j’y suis, si tu veux passer ton zsh via home-manager (facultatif encore une fois), voila ma config home-manager pour activer le super paquet powerlevel-10k sur zsh, la complémention etc (bon faut ptet nettoyer un peu ce fichier…):

{ config, lib, pkgs, ... }:
let
  # load the configuration that we was generated the first
  # time zsh were loaded with powerlevel enabled.
  # Make sure to comment this part if you want to run
  # again 'p10k configure' and to copy the generated file
  # $ mv ~/.p10k.zsh p10k-config/p10k.zsh
  configThemeNormal = ./p10k-config/p10k.zsh;
  configThemeTTY = ./p10k-config/p10k_tty.zsh;
  zshopt = pkgs.stdenv.mkDerivation rec {
      name = "zshopt-${version}";
      version = "2c28e";

      src = pkgs.fetchFromGitHub {
        owner = "larz258";
        repo = "Zshopt";
        rev = "2c28efb8018b981a0cfe25a91879e40e02ef040b";
        sha256 = "sha256-1JXEh2A9F5stbOGtPzzyBEGQ8m5/DpAMFCT0+MYnKYE=";
      };

      installPhase = ''
        mkdir -p $out/bin
        cp shopt $out/bin 
        patchShebangs bin
      '';
    };
in
{
  fonts.fontconfig.enable = true;
  home.packages = with pkgs; [
    # Meslo Nerd Font patched for Powerlevel10k
    # Restart Konsole and configure it (profile) to choose MesloLGS NF
    meslo-lgs-nf
    # For fuzzy filter in cd
    # https://github.com/junegunn/fzf
    fzf
    any-nix-shell
    zsh
  ];
  programs.direnv.enableZshIntegration = true;
  programs.zsh = {
    enable = true;
    enableCompletion = false; # zsh-autocomplete takes care of it, documented in https://github.com/marlonrichert/zsh-autocomplete
    syntaxHighlighting.enable = true;
    enableVteIntegration = true;
    defaultKeymap = "emacs";
    initContent = ''
      source ${pkgs.fetchFromGitHub {
        owner = "marlonrichert";
        repo = "zsh-autocomplete";
        rev = "fe6c658cc420140f4c5a13d2a4369b54232aee22";
        sha256 = "sha256-KYey9sidz8VzgfM9YVaCsVXpKKdCjSHk3tuadQz9Re0=";
      }}/zsh-autocomplete.plugin.zsh
      source ${pkgs.zsh-powerlevel10k.overrideAttrs (finalAttrs: previousAttrs: {
        # Until https://github.com/romkatv/powerlevel10k/issues/2860 fix is introduced in nixpkgs
        src = pkgs.fetchFromGitHub {
          owner = "romkatv";
          repo = "powerlevel10k";
          # upstream doesn't seem to use tags anymore
          rev = "b97926675aba2d8465325d786cc69de9d9fdec84";
          hash = "sha256-lmVBVSc+SEzDr+8z5gaMKA/uSEriaB8rxTT1smgkl1Y=";
        };
      })}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme
      # By default backward deleting a word would consider / as a regular
      # word. Now this problem is gone with this option, see also
      # https://stackoverflow.com/questions/444951/zsh-stop-backward-kill-word-on-directory-delimiter
      autoload -U select-word-style
      select-word-style bash

      # Ctrl-arrows fail in konsole
      # https://unix.stackexchange.com/questions/58870/ctrl-left-right-arrow-keys-issue
      # urxvt/rxvt-unicode (and maybe others):
      bindkey "^[Od" backward-word
      bindkey "^[Oc" forward-word
      # alacritty, konsole, terminator, xterm (and maybe others):
      bindkey "^[[1;5D" backward-word
      bindkey "^[[1;5C" forward-word
      # to find the proper char just type cat and type your char!
      bindkey "^[[3~" delete-char
      # By default, only alt-backspace deletes a word, now we can also use
      # ctrl instead of Alt
      bindkey "^H" backward-kill-word

      # The powerlevel theme I'm using is distgusting in TTY, let's default
      # to something else
      # See https://github.com/romkatv/powerlevel10k/issues/325
      if zmodload zsh/terminfo && (( terminfo[colors] >= 256 )); then
        [[ ! -f ${configThemeNormal} ]] || source ${configThemeNormal}
      else
        [[ ! -f ${configThemeTTY} ]] || source ${configThemeTTY}
      fi

      any-nix-shell zsh --info-right | source /dev/stdin
      
      alias shopt='${zshopt}/bin/shopt'
    '';
    
    plugins = [
      # You can also install plugins this way (I installed powerlevel10k not using plugins here, but this is an alternative installation method):
      # {
      #   # A prompt will appear the first time to configure it properly
      #   # make sure to select MesloLGS NF as the font in Konsole
      #   name = "powerlevel10k";
      #   src = pkgs.zsh-powerlevel10k;
      #   file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
      # }
      # {
      #   name = "zsh-nix-shell";
      #   file = "nix-shell.plugin.zsh";
      #   src = pkgs.fetchFromGitHub {
      #     owner = "chisui";
      #     repo = "zsh-nix-shell";
      #     rev = "v0.5.0";
      #     sha256 = "0za4aiwwrlawnia4f29msk822rj9bgcygw6a8a6iikiwzjjz0g91";
      #   };
      # }
      # {
      #   # To easily cd to folders
      #   # https://github.com/b4b4r07/enhancd
      #   name = "enhancd";
      #   src = pkgs.fetchFromGitHub {
      #     owner = "b4b4r07";
      #     repo = "enhancd";
      #     rev = "c6967f7f70f18991a5f9148996afffc0d3ae76e4";
      #     sha256 = "sha256-p7ZG4NC9UWa55tPxYAaFocc0waIaTt+WO6MNearbO0U=";
      #   };
      #   file = "init.sh";
      # }
    ];
    # oh-my-zsh = {
    #   enable = true;
    #   theme = "robbyrussell";
    #   plugins=["git" "python" "emacs" "systemd" "autosuggestions" "zsh-syntax-highlighting" "autojump"];
    # };
  };
}

et pour emacs j’ai ça + un init.el dans le même dossier avec :

{ config, lib, pkgs, ... }:
# Todo: create a very clean interface where I can enable/disable parts of the config with a module
{
  programs.emacs = {
    enable = true;
    # Multiple versions (optimized for wayland, compile natively…)
    # The Pgtk make sure emacs uses only gtk (historically it used also non-gtk stuff)
    # and therefore ensure a better integration with Wayland
    # Some people reported it improves the experience on x11 as well while othe say
    # the one should stick to the normal version on X11… Let's try and see!
    # package = pkgs.emacs28NativeComp;
    package = pkgs.emacs-gtk;
    # Make sure to have a recent enough emacs to have vterm-kill-buffer-on-exit
    # emacs will first install these onces and ensure :t should use this list.
    # If not present it will try to install is.
    extraPackages = (epkgs: with epkgs;
      let
        my-snippets = epkgs.trivialBuild {
          pname = "my-snippets";
          version = "1.0";
          src = ./my-snippets;
          packageRequires = [ yasnippet ];
          
          preInstall = ''
            LISPDIR=$out/share/emacs/site-lisp
            mkdir -p $LISPDIR
            cp -r snippets $LISPDIR
          '';
          meta.description = "My snippets are now packaged, easier to deploy an other machines and avoid conflicts with user config!";
        };
      in
      [
        use-package
        vterm
        my-snippets
        doom-themes
        moody # Nice modeline with tabs and ribons
        minions
        aggressive-indent
        undo-tree
        debpaste
        terminal-here
        epkgs."ido-completing-read+" # epkgs is mandatory as otherwise nix has no way to know what defines this string
        smex
        magit
        nix-mode
        helm-nixos-options
        company-nixos-options
        pdf-tools
        org-noter
        # I need to use this fork as the package is not maintained anymore :location (recipe :fetcher github :repo "smile13241324/auctex-latexmk")
        auctex-latexmk
        org-ref
        auctex
        helm
        ace-jump-helm-line
        avy
        validate
        yasnippet
        yasnippet-snippets
        markdown-mode
        haskell-mode
        tuareg
        lua-mode
        scala-mode
        web-mode
        yaml-mode
        adoc-mode
        lsp-java
        projectile
        lsp-mode
        hydra
        company
        lsp-ui
        which-key
        lsp-java
        helm-lsp
        lsp-treemacs
        # For coq/easycrypt
        proof-general
        rg
        find-file-in-project # use fd in emacs
        editorconfig # to stop getting editorconfig errors in nixpkgs
        jinx # https://github.com/minad/jinx, efficient speel checker
        direnv
        graphql-mode
        minizinc-mode
        futhark-mode
        rust-mode
      ]);
    extraConfig = builtins.readFile ./init.el;
  };

  # I use doom now, and it's quite handy to have "doom" binary available (edit: don't use doom anymore, but anyway)
  home = {
    sessionPath = [ "$HOME/.emacs.d/bin" ];
    sessionVariables = {
      EDITOR = "emacsclient";
      VISUAL = "emacsclient";
    };
  };

  programs.bash.shellAliases = {
    # Start emacs in background, type "e myfile" to quickly edit a file without waiting for it to start
    "e" = "emacsclient -n";
  };

  
  # SessionPath and sessionVariables creates a hm-session file that must be sourced:
  # Beware, it puts it in .profile, not in the .bashrc!
  programs.bash = {
    enable = true;
    initExtra = ''
      . "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh"
    '';
  };

  home.packages = [
    pkgs.ripgrep
    pkgs.coreutils
    pkgs.fd
    # Lang cc
    # pkgs.clang_9
    pkgs.glslang
    pkgs.irony-server
    pkgs.rtags
    # haskell
    pkgs.hlint
    # nix
    pkgs.nixfmt
    # web
    pkgs.python3Packages.jsbeautifier
    # ocaml
    pkgs.ocamlPackages.ocp-indent
    # For easycrypt (alt-ergo is the sat solver, see also https://github.com/EasyCrypt/easycrypt/blob/eb58ec7619172737ba19f3f86ed3b264fc8d6017/README.md)
    pkgs.easycrypt
    pkgs.alt-ergo
    pkgs.why3
    pkgs.coq
  ];

}

j’aimerais savoir quelles recommandations faire sur les packages “systeme” (je pense qu’il ne faut pas en installer trop) et ce que je dois deporter vers les environnements deportes…

à noter qu’en dehors de nix-shell/nix develop/direnv, les compilateurs sous nixos ne trouveront aucune bibliothèque (genre openssl etc). Si on installe gcc ou openssl dans /etc/nixos/configuration.nix, gcc foo.c -l openssl ne fonctionnera donc pas. Pour cette raison je conseille de ne jamais installer de compilateurs et de bibliothèques globalement et de les rendre disponibles avec nix-shell/nix develop/direnv à la place. Dans /etc/nixos/configuration.nix on trouvera donc des services (démons) et des exécutables/applications à mettre dans le $PATH essentiellement.