diff --git a/src/posts/general_nix/post_packaging/cover.jpg b/src/posts/general_nix/post_packaging/cover.jpg new file mode 100644 index 0000000..563ae9f Binary files /dev/null and b/src/posts/general_nix/post_packaging/cover.jpg differ diff --git a/src/posts/general_nix/post_packaging/packaging.nix b/src/posts/general_nix/post_packaging/packaging.nix new file mode 100644 index 0000000..a83eecc --- /dev/null +++ b/src/posts/general_nix/post_packaging/packaging.nix @@ -0,0 +1,42 @@ +{ + description = "An flake to provide dev and build environnement for presenterm post production"; + + inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.1"; + + outputs = inputs: { + devShells = forEachSupportedSystem ( { pkgs }: { + default = pkgs.mkShell { + packages = with pkgs; [ + presenterm + python313Packages.weasyprint + ]; + }; + } ); + + packages = forEachSupportedSystem ( { pkgs }: { + default = pkgs.stdenv.mkDerivation { + inherit (pkgs) system; + name = "linkedin-shoblog-posts"; + src = ./src; + buildInputs = with pkgs; [ + presenterm + python313Packages.weasyprint + ]; + buildPhase = + let + font_dir = pkgs.nerd-fonts.jetbrains-mono; + config = pkgs.writeTextFile { + name = "presenterm.conf"; + text = '' + # presenterm configuration + ''; + }; + in + '' + export PRES_CONFIG=${config} + python scripts/build.py + ''; + }; + } ); + }; +} diff --git a/src/posts/general_nix/post_packaging/post_packaging.md b/src/posts/general_nix/post_packaging/post_packaging.md new file mode 100644 index 0000000..b6d4600 --- /dev/null +++ b/src/posts/general_nix/post_packaging/post_packaging.md @@ -0,0 +1,104 @@ +--- +options: + command_prefix: "pr:" +theme: + name: tokyonight-storm + override: + default: + # colors: + # foreground: "4c4f69" + # background: "ffffff" + code: + alignment: center + palette: + colors: + base00: "24283B" + base01: "16161E" + base02: "343A52" + base03: "444B6A" + base04: "787C99" + base05: "A9B1D6" + base06: "CBCCD1" + base07: "D5D6DB" + base08: "C0CAF5" + base09: "A9B1D6" + base0A: "0DB9D7" + base0B: "9ECE6A" + base0C: "B4F9F8" + base0D: "2AC3DE" + base0E: "BB9AF7" + base0F: "F7768E" +--- + +presenterm build process with nix +=== +```file +line_numbers +path: packaging.nix +language: nix +``` +Hier je me suis dit que j'allais faire un petit repo avec les différents posts de +cette série, histoire de rendre les textes source accessible entre autre pour les +personnes malvoyantes ou juste pour ceux ne souhaitant pas lire des images en 24px * 24px. +Problème, mon cerveau un peu mal fichu, c'est aussi dit "tient, et si tu en profitais +pour faire un flake avec un environnement dev pour qui voudrait preview tes slides +sans avoir à installer presenterm puis "hey mais attend, tu pourrais aussi faire +en sorte de générer un package avec nix qui contient tous les PDF", ce qui inclut +donc de les générer au moment du packaging. +Et donc après quelques heures de trifouillage, me voici pour vous présenter mes +bêtises. +Vous connaissez la routine, lancez spotify et c'est parti pour un peu de lecture +# album du jour +## Neo: the world end with you original soundtrack - Takeharu Ishimoto +![](./cover.jpg) + +OK, comment ça marche ? +=== +Avant de parler de ce que sont les flakes et de leur intérêt dans l'écosystème +de nix, commençons par la base, qu'est-ce qu'un package en nix ? "Simplement", +une fonction qui décrit un process de build, pour reprendre les exemples des articles +précédents, pour le packaging des assets de mon site avec **Vue**, nous avons une +fonction prenant en entrée les dépendances nécessaires pour le process de build, +puis décrivant ce dernier, puis retournant uniquement les assets builder sous la +la forme d'un path dans le store nix. Grossièrement, en terme de code cela donnerais +quelque chose du style: +```nix +# package.nix +{ pkgs }: pkgs.stdenv.mkDerivation { + pname = "mon super website"; + version = "3.14"; + src = pkgs.fetchgit { + url = "http://git.shobu.fr/shoblog/front"; + rev = "069d2a5bfa4c4024063c25551d5201aeaf921cb3"; + sha256 = "sha256-MlqJOoMSRuYeG+jl8DFgcNnpEyeRgDCK2JlN9pOqBWA="; + }; + buildInputs = with pkgs; [ + node + yarn + ]; + buildPhase = ''yarn build''; + installPHase = '' + mkdir -p $out/dist + cp dist $out + ''; +} +``` +L'exemple est bien sûr quelque peu simplifié, mais dans les grandes lignes : +* `{ pkgs }: {}`: constitue notre fonction, avec en argument *pkgs* qui correspond +à une instance de nixpkgs. +* `pkgs.stdenv.mkDerivation`: est la fonction la plus basique nous permettant de créer +un package, les autres fonction, comme mkYarnPackage, étendent cette dernière. +Cette fonction prend elle aussi plusieurs arguments qu'elle vas utiliser pour builder +notre package + * `pname` et `version`: le nom de notre package et sa version + * `src`: les fichiers qui serons accessible dans notre environnement de build et + qui constituent la source de notre package. + * `buildInputs`: les paquets qui serons accessibles dans notre environnement + de build. + * `buildPhase` et `installPhase`: Les hook qui décrivent comment builder et installer + notre paquet. Il existe d'autre hooks pour d'autre usages décris dans la documentation. + +Vous aurez remarqué de votre œil attentif que la fonction s'appelle `mkDerivation`, +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".