Je travaille depuis quelque temps sur Elpe, un projet qui vise à obtenir les bonnes propriétés de Nix/NixOS (les mises à jour atomiques, la reproductibilité), mais avec des paquets Ubuntu.
Le code : https://nest.pijul.com/pmeunier/elpe
L'idée est de définir des recettes de compilation en OCaml et de les envoyer à un backend Rust, qui se charge de les exécuter dans un conteneur sans réseau, en exposant uniquement le contexte nécessaire à la bonne exécution de la compilation. Les produits du build sont indexés par le contenu de la recette du build, et indexés une deuxième fois par le résultat : c'est ce deuxième hash qui est utilisé dans les dépendants du paquet, ce qui permet de construire un arbre de Merkle du système complet (et non seulement de ses sources), qui rend toute modification ultérieure facilement détectable.
De plus, le système de base provient des dépôts de paquet Debian ou Ubuntu. Cependant, tous les chemins sont hard-codés (comme dans Nix), ce qui permet de garantir la reproductibilité, au détriment toutefois du coût de mise à jour en termes d'espace et opérations disque.
Si le choix de Rust devient relativement consensuel par les temps qui courent, OCaml est plus surprenant. Après divers essais avec plusieurs langages, je l'ai choisi parce que c'est le seul langage avec à la fois :
- Une bonne approximation du système de types dont j'avais besoin: typage nominal et aussi structurel, entre autres.
- Un système de types relativement simple (pas de typeclasses ni de monades comme en Haskell, de borrow checkers comme en Rust ni de types dépendants comme en TypeScript).
- Du late binding, nécessaire pour exprimer des "overrides" et des "hooks", courants quand on veut compiler des choses (autoconf et make ont plein d'options de ce type, par exemple).
- Un compilateur ultra-rapide.
- Un bytecode, pour (dans le futur) contrôler aussi l'isolation du code de build de façon très légère.
La simplicité et l'expressivité d'OCaml sont bien adaptés à ce projet: les fonctions simples à concevoir y sont relativement claires à énoncer.
Pourquoi pas NixOS, me direz-vous ? En tant qu'utilisateur et contributeur depuis environ 10 ans, un certain nombre de problèmes plus ou moins récents m'ont motivé à explorer une alternative:
En termes de gouvernance, la communauté a traversé dans la dernière année plusieurs crises de différentes tailles (Anduril, Devenv…). On pourrait y voir un signe de maturation ou au moins de croissance du projet, mais plusieurs éléments me permettent d'en douter, dont les réactions répétées de la fondation Nix, qui semble avoir beaucoup de mal à comprendre les messages pourtant clairs des contributeurs.
Je vois aussi les choix de design imposés par les fondateurs du projet depuis quelques années comme un bien mauvais signe: les flakes (en 2020) étaient une première incarnation de cette tendance, et plus récemment la "distribution propriétaire" de Nix est clairement une mauvaise idée, alors que la qualité de code de Nix n'est pas au niveau où on l'attendrait et que le gros du projet repose depuis plusieurs années sur le travail pharaonique des contributeurs de Nixpkgs.
On pourrait parler longtemps de la sécurité de Nix, qui me fait de plus en plus peur y compris pour mon usage personnel. Les process de gestion des rapports ne me conviennent pas, de même que l'opacité de certains choix techniques (les flags de compilation désactivés sur certaines plateformes, entre autres), souvent bien cachés dans les entrailles de Nixpkgs.
Enfin, le langage trop complexe à utiliser (principalement par manque de typage statique et de messages d'erreurs pertinents) rend Nix difficile à utiliser au sein d'une organisation d'une taille importante, et encourage les comportements peu inclusifs (éviter d'écrire de la doc, inventer des casse-têtes pour faire des choses simples…). Je suis bien sûr conscient que des entreprises (comme Anduril) et des ONGs (comme Médecins Sans Frontières) l'utilisent, mais je ne pense pas que ce soit généralisable aux situations où j'aimerais voir ce genre de projet utilisé.
# Pourquoi pas Guix
Posté par madhatter (site web personnel) . Évalué à 2 (+1/-0).
Salut,
c'est très intéressant, merci !
Je ne connais pas assez NixOS et pas encore assez Guix, mais de la même manière que tu détailles « pourquoi pas NixOS » et les différences de conception qu'il entretient avec ton projet, pourrais-tu détailler les différences qu'il y a avec Guix et pourquoi tu as choisi de créer quelque chose de nouveau ?
Pour ma part j'ai choisi de m'intéresser à Guix plutôt qu'à Nix notamment à cause au langage utilisé. Le Scheme n'est pas forcément évident à appréhender (loin de là - en tout cas pour moi) mais au moins je pourrai m'en servir dans d'autres contextes contrairement au langage propre à Nix.
There is no spoon...
[^] # Re: Pourquoi pas Guix
Posté par pmeunier . Évalué à 3 (+2/-0).
Je suis fan de Guix aussi, mais je pense qu'il partage plusieurs problèmes avec Nix. Entre autres:
Le problème de gouvernance est le même, même si Ludovic Courtès semble avoir de très bonnes intentions, c'est aussi le cas de Lix, et c'était aussi le cas des gens de Nix il y a encore quelques années. Il ne suffit pas à mon avis de dire "oui mais nous on est les gentils" pour régler le problème.
L'intérêt d'avoir une solution basée sur une source de paquets externe est de pouvoir sous-traiter et financiariser le problème de la confiance dans les paquets.
Lisp ne résout pas tellement le problème du langage Nix. La principale difficulté dans le passage à l'échelle dans une organisation n'est pas dans les détails syntaxiques du langage, mais dans la capacité d'écrire des programmes qui renvoient des messages d'erreurs utiles, malgré le fait que la plupart des ingénieurs sont peu amenés à pratiquer le langage en question (parce qu'on n'installe pas des machines tous les quatre matins, en tout cas Nix prétend qu'on n'aura pas/peu à le faire).
Et sinon, l'objectif d'Elpe est assez différent de Nix et Guix, et surtout de Nixpkgs ou son équivalent Guix: il ne s'agit pas ici de refaire une distribution Linux de zéro, mais plutôt d'apporter les bonnes propriétés de Nix et de Guix à une distribution existante (Ubuntu ou Debian).
# Flakes
Posté par saltimbanque (site web personnel) . Évalué à 2 (+0/-0).
J'ai rejoins le bateau un peu récemment pour me prononcer, mais que critiques tu dans les Flake? Je comprends qu'il permettent basiquement de nixifier nimporte quelle source, tout en spécifiant au besoin la release voire le commit, ce qui est assez top sur le papier…
[^] # Re: Flakes
Posté par pmeunier . Évalué à 1 (+0/-0).
Je reproche plusieurs choses aux flakes:
La syntaxe précédente était bien plus simple et moins verbeuse, et il aurait été facile de changer juste la sémantique des "chemins" (la syntaxe
<nixpkgs>
) pour gérer tous les cas gérés par les flakes. Par exemple, aujouter un .lock à côté des default.nix.Les flakes ont été imposés sans aucune discussion ni RFC de la communauté.
La vision de "bibliothèques Nix" est à mon avis un gros problème de sécurité, en fragmentant l'écosystème et en le rendant les audits encore plus difficiles.
Le design lui-même a plein de trous: par exemple, le nixpkgs implicite ou encore
nix run
qui peut permettre de surcharger les noms entre "apps" et "packages". Le manque de stabilisation encourage l'écriture d'une grande quantité de code Nix reposant sur des bases fragiles.Enfin, à l'échelle d'une organisation, l'articulation entre les différents projets n'est pas particulièrement simplifiée par les flakes, contrairement à ce qu'on entend parfois.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.