Création de package Nix : installation d'une police non disponible
By WORMS David
29 mars 2022
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
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 !