From 5b4f569312bedda7e0ee6dcba00d9f2f8370f267 Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Sat, 5 Oct 2024 23:26:18 +0200 Subject: [PATCH] Improvement --- assets/icons/linkedin.svg | 10 +- assets/scss/custom.scss | 3 + config/_default/params.yml | 2 +- content/page/archives/index.md | 2 +- content/page/links/index.md | 33 ---- content/page/search/index.md | 2 +- content/post/nix_flake/index.md | 303 ++++++++++++++++---------------- static/favicon.ico | Bin 0 -> 21662 bytes static/favicon.png | Bin 639 -> 0 bytes 9 files changed, 161 insertions(+), 194 deletions(-) delete mode 100644 content/page/links/index.md create mode 100644 static/favicon.ico delete mode 100644 static/favicon.png diff --git a/assets/icons/linkedin.svg b/assets/icons/linkedin.svg index 73eed3f..f3fee4f 100644 --- a/assets/icons/linkedin.svg +++ b/assets/icons/linkedin.svg @@ -1,8 +1,4 @@ - - - - - - - + + + \ No newline at end of file diff --git a/assets/scss/custom.scss b/assets/scss/custom.scss index a47ae1c..e006fce 100644 --- a/assets/scss/custom.scss +++ b/assets/scss/custom.scss @@ -1,3 +1,6 @@ /* You can add your own custom styles here. */ +.menu-social svg { + color: var(--body-text-color); +} \ No newline at end of file diff --git a/config/_default/params.yml b/config/_default/params.yml index 8a54015..2cb0c09 100644 --- a/config/_default/params.yml +++ b/config/_default/params.yml @@ -2,7 +2,7 @@ mainSections: - post rssFullContent: true -favicon: /favicon.png +favicon: /favicon.ico article: headingAnchor: false diff --git a/content/page/archives/index.md b/content/page/archives/index.md index 2b1bf20..1ed9391 100644 --- a/content/page/archives/index.md +++ b/content/page/archives/index.md @@ -5,7 +5,7 @@ layout: "archives" slug: "archives" menu: main: - weight: 2 + weight: 3 params: icon: archives --- \ No newline at end of file diff --git a/content/page/links/index.md b/content/page/links/index.md deleted file mode 100644 index ef8bb3e..0000000 --- a/content/page/links/index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Links -links: - - title: GitHub - description: GitHub is the world's largest software development platform. - website: https://github.com - image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png -menu: - main: - weight: 4 - params: - icon: link - -comments: false ---- - -To use this feature, add `links` section to frontmatter. - -This page's frontmatter: - -```yaml -links: - - title: GitHub - description: GitHub is the world's largest software development platform. - website: https://github.com - image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png - - title: TypeScript - description: TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. - website: https://www.typescriptlang.org - image: ts-logo-128.jpg -``` - -`image` field accepts both local and external images. \ No newline at end of file diff --git a/content/page/search/index.md b/content/page/search/index.md index 7507b68..c9ce623 100644 --- a/content/page/search/index.md +++ b/content/page/search/index.md @@ -7,7 +7,7 @@ outputs: - json menu: main: - weight: 3 + weight: 4 params: icon: search --- \ No newline at end of file diff --git a/content/post/nix_flake/index.md b/content/post/nix_flake/index.md index 7776374..beff3f7 100644 --- a/content/post/nix_flake/index.md +++ b/content/post/nix_flake/index.md @@ -1,6 +1,6 @@ --- title: Découverte de Nix et de Flake -description: Installation de pmbootstrap et compilation d'un paquet Postmarket OS +description: Explication du langage Nix et de Flake, mais aussi comment les utiliser pour créer ses propres environnements de travail. slug: nix-flake date: 2024-10-04 00:00:00+0000 categories: @@ -8,19 +8,21 @@ categories: tags: - Nix - Flake -weight: 1 # You can add weight to some posts to override the default sorting (date descending) +weight: 1 --- --- ## Introduction +> Avant de commencer, je tiens à dire que j'ai fait ce post en partie pour l'entreprise [Unova](https://unova.fr/) où je travaillais. Je tiens à les remercier pour m'avoir autorisé à réutiliser le contenu sur mon site. + Nix est un gestionnaire de paquets basé sur le langage Nix. Il permet de gérer facilement une configuration système, d'un projet ou même d'un package (logiciel) et surtout de s'assurer de la reproductibilité de la configuration. Cependant, par défaut, Nix ne permet pas de "lock" la version de la configuration sur l'ensemble des machines. C'est pour cela que les développeurs développent Flake. Flake est une feature experimentale qui permet de lock les dépendances sur une version très précise. Un peu comme le Gemfile.lock ou même le package-lock.json. -Grâce au coté déclaratif de Nix, on peut par exemple facilement tester un outils sans l'installer de manière permanente sur sa machine avec : +Grâce au coté déclaratif de Nix, on peut par exemple facilement tester un outils sans devoir l'installer de manière permanente sur sa machine avec : ```bash nix run nixpkgs#cowsay Salut # Lance directement la commande cowsay avec l'argument Salut @@ -37,23 +39,84 @@ Ou même configurer son shell existant pour pouvoir développer sur un logiciel ```bash nix develop nixpkgs#cowsay # Prépare le shell actuel avec toutes les dépendances nécessaires pour compiler et exécuter cowsay ``` -> **Attention: Ne clone pas les sources** +> **Attention: Il créer un shell avec les outils nécessaires pour travailler dessus, mais ne récupère pas le projet en lui-même.** -## Lexique +## Le langage Nix + +Nix est un langage de programmation dédié pour la configuration d'une machine ou compilation de programme donc il peut être compliqué à prendre en main. +Il est différent des langages traditionnels, on peut le voir comme un language de construction d'un `attribut set` qui sera utilisé ensuite. + +> Un `attribut set` peut-être vu comme un objet JS. +> ```nix +> { a = 12; b = 14; } +> ``` + +Je ferrais surement un post pour expliquer plus en détail le langage car il est assez complexe. J'ai rajouté quelques liens utiles [ici](#liens-utiles) -- `attribute set` => Fonctionne un peu comme un Hash en Ruby ou un object en JS -- `package` => Représente un logiciel, binaire, script, librairies installable sur le système. -- `derivation` => Représentation d'un package en Nix. Les fonctions `mkShell`, `writeScriptBin`, `buildGoModule`, `buildNpmPackage`, `buildRustPackage`, ... sont juste une surcouche pour faciliter la construction d'une dérivation. Derrière, ils appelent tous la fonctions `mkDerivation`. (Ex pour `buildGoPackage` https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/go/module.nix ) -- `nix` => Gestionnaire de package et le language de programmation -- `flake` => Configuration reproductible localisé sur un repo git (projet). -> Attention: Le flake.nix ou flake.lock doit-être ajouté dans git avec un `git add flake.nix flake.lock` car sinon vous ne pourrait pas utiliser le Flake. ## Structure d'un Flake -### Introduction +### Partie `inputs` -On va ce baser sur cette exemple ci-dessous pour expliquer chaque partie du Flake. +```nix +inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; +}; +``` +Dans cette exemple, on peut voir que j'ai rajouté les dépendances `nixpkgs` et `flake-utils`. + +La dépendance `nixpkgs` correspond au repo [github nixpkgs](https://github.com/NixOS/nixpkgs). En général, on l'utilise pour récupérer des packages ou utiliser les outils mis à disposition par les contributeurs de NixOS. + +On peut retrouver dans le repo. +- `/nixos` Contiens la configuration pour nixos (La distribution basée sur Nix) +- `/pkgs` Contiens tous les packages (ex: ruby_3_3) +> Les nouveaux packages doivent être mis dans le sous-dossier `by-name`. C'est un nouveau standard du projet. Les packages déjà existants migrent dessus petit à petit. Si un package manque, n'hésitez surtout pas à contribuer au projet. +- `lib` Contiens plein d'outils pratiques comme `makeLibraryPath` ou `makeIncludePath` +- `doc` Contiens la doc ^^ +- `maintainers` Contiens la liste de tous les mainteneurs des packages. + +La dépendance `flake-utils` contient des helpers pour faciliter la configuration pour un ensemble de systèmes (`x86_64-linux`, `x86_64-darwin`, ...). +> `darwin` Correspond au système Mac OS + +### Partie `outputs` + +Outputs est une fonction qui prend en paramètre un `attribute set` avec pour attributs self et les dépendances déclarées dans la partie `inputs`. + +Dans le cas ou l'on a les dépendances suivantes: +```nix +inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + mon-input-custom.url = "github:mongithub/monprojet"; +}; +``` + +On aura les entrées suivantes dans `outputs`: +```nix +outputs = { self, nixpkgs, flake-utils, mon-input-custom }: +# ^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ +# Doit avoir le même nom que dans les inputs +{ + devShells.x86_64-linux.default = {...}; + packages.x86_64-linux.default = {...}; + nixosConfigurations.x86_64-linux.default = {...}; +} +``` + +Les attributs que l'on peut retrouver dans `outputs` sont: +- `devShells` Des environnements de développement. +- `nixosConfigurations` Des configurations de NixOS (La distribution Linux) +- `darwinConfigurations` Des configurations pour Mac OS [En savoir plus](https://github.com/LnL7/nix-darwin) +- `packages` Des packages (Docker, ruby, go, rust, ...) +- `[...]` + + +### Exemple de flake + +Dans cette example, j'ai déclaré un environnement de travail utilisable avec la commande `nix develop`. +J'ai rajouté en dépendances la librairie `openssl`, la commande `redis` et un script au lancement du shell. ```nix { @@ -73,7 +136,7 @@ On va ce baser sur cette exemple ci-dessous pour expliquer chaque partie du Flak devShells = rec { default = pkgs.mkShell { inputsFrom = with pkgs; [openssl]; - packages = with pkgs; [redis minio]; + packages = with pkgs; [redis]; shellHook = '' echo "Votre shell est configuré" ''; @@ -83,79 +146,7 @@ On va ce baser sur cette exemple ci-dessous pour expliquer chaque partie du Flak } ``` -### Partie `inputs` - -Dans ce flake, on peut trouver tout d'abord la partie `inputs`, elle correspond aux dépendances de notre flake. - -La dépendance (inputs) `nixpkgs` correspond au repo [github nixpkgs](https://github.com/NixOS/nixpkgs). En général, on l'utilise pour récupérer des packages ou utiliser les outils mis à disposition par les contributeurs de NixOS. - -On peut retrouver dans le repo. -- `/nixos` Contiens la configuration pour nixos (La distribution basée sur Nix) -- `/pkgs` Contiens tous les packages (ex: ruby_3_3) -> Les nouveaux packages doivent être mis dans le sous-dossier `by-name`. C'est un nouveau standard du projet. Les packages déjà existants migrent dessus petit à petit. Si un package manque, n'hésitez surtout pas à faire des PR sur github. -- `lib` Contiens plein d'outils pratiques comme `makeLibraryPath` ou `makeIncludePath` -- `doc` Contiens la doc ^^ -- `maintainers` Contiens la liste de tous les mainteneurs des packages. - -La dépendance (inputs) `flake-utils` contient des helpers pour faciliter de la configuration pour un ensemble de systèmes (`x86_64-linux`, `x86_64-darwin`, ...). -> darwin => Mac OS - -### Partie `outputs` - -Outputs prend une fonction qui prend en paramètre un `attribute set` avec pour attributs self et les inputs déclarés dans la partie `inputs`. - -Dans le cas ou l'on a les inputs suivants: -```nix -inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - mon-input-custom.url = "github:mongithub/monprojet"; -}; -``` - -On aura les attributs suivants dans `outputs`: -```nix -outputs = { self, nixpkgs, flake-utils, mon-input-custom }: -{ - ... -} -``` - -Elle correspond aux configurations disponibles pour un flake pour chaque système. - -```nix -outputs = { self, nixpkgs }: -{ - devShells.x86_64-linux.default = {...}; - packages.x86_64-linux.default = {...}; - nixosConfigurations.x86_64-linux.default = {...}; -}; -``` - -> Rappel Nix -> -> `add = a: b: a + b` -> -> Créer une fonction avec le nom `add` qui prend en paramètre `a` et `b` et qui renvoie l'addition des deux. On déclare un paramètre avec la syntaxe `[nom du paramètre]:` -> -> `add 1 2` renvoie `3` -> -> On peut également faire des variantes. -> -> `add3N = add 3` -> -> `add3N 10` renvoie `13` -> -> Car `add 3` renvoie une fonction avec le premier paramètre a = 3 - -Les attributs que l'on peut retrouver dans `outputs` sont : -- `devShells` Des environnements de développement. -- `nixosConfigurations` Des configurations de NixOS (La distribution Linux) -- `darwinConfigurations` Des configurations pour Mac OS [En savoir plus](https://github.com/LnL7/nix-darwin) -- `packages` Des packages (Docker, ruby, go, rust, ...) -- `[...]` - -## Comment mettre à jour le `flake.lock` +## Mettre à jour le `flake.lock` Le flake.nix vient avec un fichier flake.lock qui permet de vérrouiller la version de chaque input. Si on souhaite mettre à jour nos packages pour notre projet. Il est nécessaire de le mettre à jour. @@ -163,7 +154,7 @@ On retrouve deux commandes: - `nix flake update` Mets à jour tous les inputs - `nix flake lock --update-input