Support Ukrain
Adaltas logoAdaltasAdaltas logoAdaltas
Création de package Nix : installation d'une police non disponible

Création de package Nix : installation d'une police non disponible

WORMS David

By WORMS David

29 mars 2022

Catégories
Hack
Tags
Enseignement et tutorial
Linux
Packaging
GitOps
NixOS
Open source

La collection de packages Nix est importante avec plus de 60 000 packages. Cependant, il y a de fortes chances que parfois le package dont vous avez besoin ne soit pas disponible. Vous devez l’intégrer vous-même.

J’avais besoin de certaines polices qui n’étaient pas déjà présentes dans nixpkgs. Avec Nix, une police est distribuée sous forme de package comme n’importe quel autre logiciel. Une des polices à installer est Dancing Script. Au moment d’écrire ces lignes, la recherche dans nixpkgs ne révèle aucune correspondance pertinente :

nix search nixpkgs dancing 

Que votre système démarre avec NixOS ou utilise simplement le gestionnaire de packages Nix, comme je le fais avec MacOS, la création d’un package Nix n’est pas toujours si difficile. Le package que nous créerons fonctionnera pour chaque déploiement Nix. Je fournis les commandes pour Linux exécutant NixOS et pour MacOS utilisant nix-darwin. C’est certainement intimidant. Vous devez vous salir les mains et écrire du code. Cependant, compte tenu de la nature de Nix, la majorité d’entre nous ont déjà quelques fichiers de configuration Nix personnalisés. Finalement, je illustrerai le processus de création et de partage d’un nouveau package Nix avec la communauté.

Installation de polices avec NixOS

NixOS propose de nombreux packages de polices. Pour qu’une police soit visible par toutes vos applications, elle doit être enregistrée dans la liste d’options fonts.fonts. Par exemple, à partir de votre fichier principal configuration.nix :

{ config, pkgs, ... }:

{
  imports =
    [
      ./david-framework-hardware.nix
    ];
  # ...
  fonts.enableFontDir = true;
  fonts.fonts = with pkgs; [    dejavu_fonts    inter  ];  # ...
}

Toutes les polices ne sont pas disponibles chez nixpkgs. Voici comment declarer dans la liste d’options fonts.fonts une police non prise en charge en créant notre propre package. Une fois le package prêt, nous le publions !

Trouver un exemple approprié

La documentation NixOS est déroutante. Elle est répartie entre plusieurs emplacements. Parfois, il manque des informations de base et parfois elle va si loin dans les détails qu’elle est difficile à comprendre. La lecture du code source est une approche recommandée pour apprendre le langage et personnaliser votre environnement.

Quelque soit le système, l’installation d’une police consiste à la télécharger dans l’emplacement système approprié. Découvrons comment les autres polices sont installées, par exemple la police de caractères Inter. Recherchez inter via la recherche Nix. Un lien source apparait qui pointe vers le package dans le dépôt nixpkgs :

{ lib, fetchzip }:

let
  version = "3.19";
in fetchzip {
  name = "inter-${version}";

  url = "https://github.com/rsms/inter/releases/download/v${version}/Inter-${version}.zip";

  postFetch = ''
    mkdir -p $out/share/fonts/opentype
    unzip -j $downloadedFile \*.otf -d $out/share/fonts/opentype
  '';

  sha256 = "sha256-8p15thg3xyvCA/8dH2jGQoc54nzESFDyv5m47FgWrSI=";

  meta = with lib; {
    homepage = "https://rsms.me/inter/";
    description = "A typeface specially designed for user interfaces";
    license = licenses.ofl;
    platforms = platforms.all;
    maintainers = with maintainers; [ demize dtzWill ];
  };
}

Le package contient des métadonnées telles que le nom du package, un lien vers le projet officiel et une description. Les propriétés url et sha256 sont utilisés par fetchzip pour télécharger les fichiers de police. Chaque fichier .otf est extrait de l’archive zip dans le dossier $out/share/fonts/opentype.

Création d’un package

En parcourant le dépôt Dancing Script, aucun téléchargement n’est disponible. Au lieu de la fonction fetchzip utilisée pour télécharger une archive .zip, nous utilisons la fonction fetchFromGitHub pour télécharger l’instantané d’un dépôt GitHub.

Le code est organisé différemment, avec des propriétés différentes, mais il atteint le même objectif. À côté de votre fichier configuration.nix, créez le fichier dancing-script/default.nix :

{ lib, fetchFromGitHub }:

let
  pname = "dancing-script";
  version = "2.0";
in fetchFromGitHub {
  name = "${pname}-${version}";
  
  owner = "impallari";
  repo = "DancingScript";
  rev = "f7f54bc1b8836601dae8696666bfacd306f77e34";
  sha256 = "dfFvh8h+oMhAQL9XKMrNr07VUkdQdxAsA8+q27KWWCA=";

  postFetch = ''
    tar xf $downloadedFile --strip=1
    install -m444 -Dt $out/share/fonts/truetype fonts/ttf/*.ttf
  '';

  meta = with lib; {
    description = "Dancing Script";
    longDescription = "A lively casual script where the letters bounce and change size slightly.";
    homepage = "https://github.com/impallari/DancingScript";
    license = licenses.ofl;
    platforms = platforms.all;
    maintainers = with maintainers; [ wdavidw ];
  };
}

Une fois le dépôt GitHub récupéré, nous installons tous les fichiers .ttf dans le dossier $out/share/fonts/truetype.

Définition d’un package

En supposant que nous modifions un fichier configuration.nix colocalisé avec le dossier dancing-script, nous importons le nouveau package dans la liste d’options fonts.fonts :

{ config, pkgs, ... }:

let
  dancing-script = import ./dancing-script/default.nix {    inherit lib;    fetchFromGitHub = pkgs.fetchFromGitHub;  };in {
  imports =
    [
      ./david-framework-hardware.nix
    ];
  # ...
  fonts.enableFontDir = true;
  fonts.fonts = with pkgs; [
    dancing-script    dejavu_fonts
    inter
  ];
  # ...
}

Notez comment nous satisfaisons les dépendances du package en injectant lib et fetchFromGitHub lors de l’appel à import. Une approche plus courte et plus simple utilise callPackage :

{ config, pkgs, ... }:

let
  dancing-script = pkgs.callPackage ./dancing-script/default.nix {  };in {
  imports =
    [
      ./david-framework-hardware.nix
    ];
  # ...
  fonts.enableFontDir = true;
  fonts.fonts = with pkgs; [
    dancing-script    dejavu_fonts
    inter
  ];
  # ...
}

La commande nixos-rebuild switch (ou darwin-rebuild switch sous MacOS) charge la police dans le système. Sous Linux, fc-list liste les polices disponibles dans le système :

fc-list | grep dancing/nix/store/fm8y81bjhcy8p4cp32230xr78807x0ii-dancing-script-2.000/share/fonts/truetype/DancingScript-Bold.ttf: Dancing Script:style=Bold
/nix/store/fm8y81bjhcy8p4cp32230xr78807x0ii-dancing-script-2.000/share/fonts/truetype/DancingScript-Regular.ttf: Dancing Script:style=Regular

Intégration de packages avec nixpkgs

Maintenant que notre package fonctionne, la prochaine étape consiste à partager notre travail avec la communauté.

Commencez par forker le dépôt nixpkgs et clonez le fork sur votre machine :

git clone origin https://github.com/wdavidw/nixpkgs.git
cd nixpkgs

Des instructions sur comment contribuer au projet sont écrites dans CONTRIBUTING.md. La création d’une merge request pour proposer un nouveau package implique 3 commits :

  • création du fichier définissant le package Nix ;
  • mise à jour de pkgs/top-level/all-packages.nix pour enregistrer le paquet ;
  • mise à jour de maintainers/maintainer-list.nix pour vous inscrire si vous ne déjà pas.

Dans pkgs/data/fonts, créez un nouveau dossier dancing-script et importez le fichier default.nix présent ci-dessus.

Mettez également à jour les fichiers all-packages.nix et maintener-list.nix. Leur contenu est explicite. En outre, il existe une sorte d’ordre dans ces deux fichiers, mais il n’est pas strictement appliqué.

Le premier enregistre notre nouveau package :

  # ...
  dancing-script = callPackage ../data/fonts/dancing-script { };
  # ...

Le second vous enregistre en tant que contributeur :

  # ...
  wdavidw = {
    name = "David Worms";
    email = "david@adaltas.com";
    github = "wdavidw";
    githubId = 46896;
  };
  # ...

La valeur githubId est exposée par l’API GitHub à https://api.github.com/users/{username}, en remplaçant {username} par votre handle GitHub.

Le paquet dancing-script est maintenant enregistré dans nixpkgs.

Tester les packages de nixpkgs.

Avant de soumettre la pull request, il est possible d’associer et de tester notre configuration Nix avec le dépôt local nixpkgs. Exécutez la commande nixos-rebuild switch (ou darwin-rebuild switch sur MacOS) avec l’argument supplémentaire -I pour reconfigurer la machine avec les packages nixpkgs locaux, y compris notre dernier ajout.

Au préalable, nous mettons à jour et simplifions notre fichier configuration.nix en conséquence :

{ config, pkgs, ... }:

{
  imports =
    [
      ./david-framework-hardware.nix
    ];
  
  # ...
  fonts.enableFontDir = true;
  fonts.fonts = with pkgs; [
    dancing-script
    dejavu_fonts
    inter
  ];
  # ...
}

Depuis le répertoire nixpkgs, la commande pour reconfigurer la machine à l’aide du dépôt nixpkgs local est :

nixos-rebuild switch -I nixpkgs=.

Publication de package

Le processus de partage des modifications avec la communauté est du GitOps standard.

Les modifications sont comittés avec :

git add \
  maintainers/maintainer-list.nix \
  pkgs/data/fonts/dancing-script/default.nix \
  pkgs/top-level/all-packages.nix
git commit -m 'dancing-script: init at 2.0'
git push origin master

Le message de commit respecte les instructions présentes dans CONTRIBUTING.md. Accédez à votre dépôt GitHub et créez la merge request.

Conclusion

Le résultat final a été publié juste avant cet article. La merge request est visible en ligne sous le nom « PR #166057, dancing-script : init at 2.0 ». Elle fut fusionné dans un délai inférieur à 24h et je suis maintenant un mainteneur officiel de NixOS !

Canada - Maroc - France

International locations

10 rue de la Kasbah
2393 Rabbat
Canada

Nous sommes une équipe passionnée par l'Open Source, le Big Data et les technologies associées telles que le Cloud, le Data Engineering, la Data Science le DevOps…

Nous fournissons à nos clients un savoir faire reconnu sur la manière d'utiliser les technologies pour convertir leurs cas d'usage en projets exploités en production, sur la façon de réduire les coûts et d'accélérer les livraisons de nouvelles fonctionnalités.

Si vous appréciez la qualité de nos publications, nous vous invitons à nous contacter en vue de coopérer ensemble.