November 28, 2022

Branches Tech

Engagé pour la qualité technologique

Création de package Nix : installez une police non encore prise en charge

6 min read
Création de package Nix : installez une police non encore prise en charge

La Collection de paquets Nix est grand avec plus de 60 000 colis. 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 à l’intérieur nixpkgs. Dans Nix, une police est distribuée sous forme de package comme n’importe quel autre logiciel. Une des polices à installer est Scénario de danse. Au moment d’écrire ces lignes, en cherchant dans nixpkgs ne révèle aucune correspondance pertinente :

nix search nixpkgs dancing 

Que votre système exécute 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 allons créer fonctionne 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. Je vais illustrer 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 paquets de polices. Pour qu’une police soit visible par toutes vos applications, elle doit être enregistrée dans le fonts.fonts liste d’options. Par exemple, à partir de votre configuration.nix dossier:

 config, pkgs, ... :


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

Toutes les polices ne sont pas disponibles sur nixpkgs. Voici comment installer une police non encore prise en charge à l’intérieur du fonts.fonts liste d’options en créant notre package. Une fois le package prêt, nous le publions !

Trouver un exemple approprié

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

Sur chaque système, l’installation d’une police consiste à la télécharger et à la placer à l’emplacement système approprié. Voyons comment les autres polices sont installées. Par exemple, le Police de caractères Inter. Chercher inter à travers le Aucune recherche. Il y a un source lien qui pointe vers le package dans le référentiel 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. La url et sha256 est utilisé par fetchzip pour télécharger les fichiers de police. Tous .otf le fichier est extrait de l’archive zip dans le $out/share/fonts/opentype dossier.

Création d’un paquet

En regardant le Scénario de danse référentiel, aucun téléchargement n’est disponible. À la place du fetchzip fonction utilisée pour télécharger un .zip archive, nous utilisons le fetchFromGitHub fonction pour télécharger l’instantané d’un référentiel GitHub.

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

 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 référentiel GitHub récupéré, nous installons tous les .ttf fichiers dans le $out/share/fonts/truetype dossier.

Déclaration de colis

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

 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 facile 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
  ];
  

Fonctionnement nixos-rebuild switch (ou darwin-rebuild switch sur macOS) charge la police dans le système. Sous Linux, fc-list répertorie 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 idées sur la façon de contribuer au projet sont écrites dans CONTRIBUTING.md. La création d’une requête de fusion pour proposer un nouveau package implique 3 commits :

  • création du fichier package Nix
  • mise à jour pkgs/top-level/all-packages.nix pour enregistrer le colis
  • mettre à jour le maintainers/maintainer-list.nix s’inscrire sauf si déjà présent

À l’intérieur pkgs/data/fontscréer un nouveau dancing-script dossier et importez le default.nix fichier présent ci-dessus.

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

Les anciens enregistrent notre nouveau forfait :

  
  dancing-script = callPackage ../data/fonts/dancing-script  ;
  

Ce dernier vous inscrira en tant que contributeur :

  
  wdavidw = 
    name = "David Worms";
    email = "[email protected]";
    github = "wdavidw";
    githubId = 46896;
  ;
  

Ton githubId la valeur est exposée par l’API GitHub à https://api.github.com/users/usernameremplaçant username avec votre pseudo GitHub.

La dancing-script package 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 local nixpkgs dépôt. Exécutez le nixos-rebuild switch commande (ou darwin-rebuild switch sur macOS) avec le supplément -I argument pour reconfigurer la machine avec les packages nixpkgs locaux, y compris notre dernier ajout.

Tout d’abord, 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
  ];
  

Du nixpkgs répertoire, la commande pour reconfigurer la machine à l’aide du référentiel nixpkgs local est :

nixos-rebuild switch -I nixpkgs=.

Publication de colis

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

Les modifications sont validées 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 validation respecte les directives trouvées dans CONTRIBUTING.md. Accédez à votre référentiel GitHub et créez la demande d’extraction.

Conclusion

Le résultat final a été publié juste avant cet article. La demande de fusion est visible en ligne sous “PR # 166057, script de danse : init à 2.0”. Il est fusionné en 24 heures et je suis maintenant un mainteneur officiel de NixOS !

Leave a Reply