diff --git a/src/posts/general_nix/post_packaging/post_packaging.md b/src/posts/general_nix/post_packaging/post_packaging.md index b6d4600..13b932c 100644 --- a/src/posts/general_nix/post_packaging/post_packaging.md +++ b/src/posts/general_nix/post_packaging/post_packaging.md @@ -101,4 +101,52 @@ Vous aurez remarqué de votre œil attentif que la fonction s'appelle `mkDerivat et non pas `mkPackage` par exemple comme on aurais pu s'y attendre. Pourquoi ça ? Dans nix, la dérivation est le bloc fondamental du système de build de nix, un package n'étant qu'une forme de dérivation. Pour rester simple, je resterais sur -l'appellation plus classique de "package". +l'appellation plus classique de "package". +Un soucis de cette approche, c'est que le type du retour de notre fonction n'est pas +specialement definis, on pourrai avoir un package comme ici, mais aussi une shell avec +mkShell, ou un host dans le cas d'une configuration nixos. Le seul moyen de le savoir, +c'est d'avoir une semantique propre sur ses noms de fichiers. De meme, les outils autour +de nix vont s'attendre a un certain type de retour, mais vont quand meme builder la derivation +avant de pouvor determiner celui-ci. Par exemple, nix-shell vas s'attendre a avoir le resultat +d'un mkShell pour fonctionner, mais n'aura pas de moyen de le savoir avant d'avoir interpreter +la fonction fournis. +C'est ainsi que pour resoudre ce probleme d'uniformitee (et quelques autres raisons), les **flakes** +on ete mis en place. + +les flakes c'est quoi ? +=== +```nix +{ + description = ""; + inputs = {}; + outputs = inputs: {}; +} +``` +Simplement, un flake est un dossier dans lequel se trouve un fichier `flake.nix` +contenant un attribut set avec les attributs suivants: +* `description`: la description de ce que fait le flake. +* `inputs`: un attribut set contenant les dependences du flake, typiquement une instance +de nixpkgs. Classiquement, chaque input est un repo contenant un autre flake, sur github, +gitlab ou en local et peut etre pin sur une branche ou un commit specifique. +* `outputs`: une fonction avec pour parametre le resultat de l'interpretation des inputs +et retournant un attribut set ou chaque attribut est un resultat possible retourne par +notre flake, bien qu'il existe des attributs standard utiliser par les outils de nix +(nix build, nix shell, nix develop), le developpeur est libre de retourner ce qu'il veut, +ce qui permet a des outils comme *colmena* de creer leur propre standards. +Pour un package, on vas ainsi retrouver l'attribut `packages..` indiquant +que le flake peut fournir un ou plusieurs packages pour une architecture donnee. +Ainsi, le flake suivant +```nix +{ + description = "un flake d'exemple"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + }; + outputs = inputs: { + packages."x86_64-linux".default = + with import inputs.nixpkgs {system = "x86_64-linux";}; + writeShellScriptBin "hello" "echo 'world hello'"; + } +} +``` +