The last package manager you'll ever need

La vidéo présente Package It, un gestionnaire de paquets minimaliste écrit en C, qui permet de télécharger et d’installer des logiciels directement depuis leurs dépôts Git, sans passer par un dépôt centralisé tiers.

Voir la source

SYNTHÈSE STRUCTURÉE

Pourquoi un nouveau gestionnaire de paquets ?

L’auteur critique le modèle traditionnel où un dépôt centralisé (comme ceux d’APT ou de Pacman) agit comme un intermédiaire entre le développeur et l’utilisateur. Il déclare : « I never saw the reason why you had to have a third-party remote repository to download your packages from rather than getting them directly from the person who made them. » Package It supprime ce « man-in-the-middle » en récupérant les paquets directement depuis leurs dépôts Git, ce qui renforce la confiance et la traçabilité.

Évolution technique : du Bash au C

Le projet a connu plusieurs réécritures :

  • Bash : prototype initial jugé « absolutely sucked » par l’auteur.
  • Nim : première version publique, mentionnée dans la première vidéo de la chaîne.
  • C++ : transition vers un langage plus portable.
  • C : version finale, choisie pour « the absolute pinnacle of portability and minimalism ». Cette réécriture a été menée par un contributeur nommé Frosty, qui a repris l’intégralité du code C++ pour le réécrire en C.

Compilation et installation

Pour compiler Package It depuis les sources :

git clone <URL_du_dépôt>
cd packageit
make

Ensuite, générer la configuration par défaut avec make defconfig. Cette commande place le fichier init.lua dans ~/.config/packageit/ si exécutée sans privilèges, ou dans /etc/packageit/ si exécutée en root (via sudo ou doas). L’installation se fait par make install ou avec un préfixe personnalisé :

make install PREFIX=~/.local

L’auteur insiste : « you need to have that prefix in your PATH » pour que la commande packageit soit accessible.

Architecture de configuration en Lua

Package It utilise Lua comme langage de configuration. Le fichier principal init.lua définit les variables globales (home, prefix, répertoires d’installation) et importe d’autres fichiers via require. L’auteur apprécie cette modularité : « you can just include things into different files and then make them into like little modules that you plug in together, like little puzzle pieces. »

Exemple de structure de configuration :

-- ~/.config/packageit/init.lua
home = os.getenv("HOME")
prefix = home .. "/.local"
install_dirs = { bin = prefix .. "/bin", lib = prefix .. "/lib" }
repositories = require("repos.init")
build_systems = require("builds.init")

Gestion des dépôts : packageit -a

La commande packageit -a <URL> ajoute un dépôt. L’URL est enregistrée dans repos.lua avec le nom dérivé du dernier segment du chemin. Pour les noms contenant des caractères spéciaux (comme un tiret), il faut utiliser la syntaxe Lua avec crochets et guillemets :

["tux-mirror"] = { url = "https://example.com/tux-mirror" }

L’auteur explique : « this minus sign is a different color than the tux and mirror. This is because that character is used for subtraction in Lua. »

Construction de paquets : packageit -b

Cette commande détecte automatiquement le système de build présent dans le répertoire courant (Makefile, CMakeLists.txt, etc.). Si un fichier buildit.lua est présent, il est utilisé comme méta-système de build. L’auteur décrit cela comme « a meta build system. You’re basically consolidating all build systems into one and then using that everywhere. »

Installation déclarative : packageit -d

La commande declare installe tous les paquets listés dans la configuration. Elle exécute dans l’ordre les fonctions pre_install, install et post_install définies pour chaque paquet. L’auteur donne un exemple d’utilisation pour configurer automatiquement un paquet après installation :

-- Dans la définition d’un paquet
post_install = function()
    os.execute("echo 'ma_configuration' > ~/.config/boomer/config")
end

Commandes essentielles

  • packageit -s <terme> : recherche un terme dans tous les dépôts configurés. Sans argument, liste tous les paquets disponibles.
  • packageit -l : liste les paquets installés localement.
  • packageit -i <paquet> : installe un paquet (équivalent à packageit install).
  • packageit -r <paquet> : désinstalle un paquet.
  • packageit -u : met à jour tous les paquets installés en exécutant git pull dans chaque dépôt, puis en réinstallant si des changements sont détectés.
  • packageit -h : affiche l’aide. L’option -H (majuscule) affiche une version concise sans logo.
  • packageit -V : affiche la version.

Le fichier buildit.lua pour les mainteneurs

Ce fichier, placé à la racine d’un projet, définit les métadonnées de construction :

-- buildit.lua
build_it_version = "1.0"
package_version = "1.1.2"
dependencies = { "luagit", "git" }
targets = {
    default = {
        build = "make",
        install = "make install PREFIX=" .. prefix
    },
    quiet = {
        build = "make --quiet",
        install = "make install --quiet PREFIX=" .. prefix
    }
}

L’auteur recommande vivement cette pratique : « I highly recommend that anyone who’s maintaining a package does this little buildit.lua file. It really puts all of your expectations for this package and its build process into one file. »

Communauté et contribution

Le projet dispose d’un salon de discussion XMPP (MUC) à l’adresse packageit@muc.simlinks.net. Les contributions sont encouragées via des patches ou des suggestions. L’auteur remercie notamment Codef Fox pour les pages de manuel (man packageit) et Indium pour le fichier EditorConfig.

CONCEPTS CLÉS

  • MUC (Multi-User Chat) : salon de discussion sur le protocole XMPP, équivalent à un canal IRC.
  • Build system autodetection : capacité de Package It à identifier automatiquement le système de build (Makefile, CMake, etc.) sans configuration explicite.
  • Meta build system : concept où un fichier buildit.lua unifie tous les systèmes de build sous une interface unique.
  • Declarative package management : approche où la liste des paquets et leur configuration sont définies dans un fichier, puis appliquées en une seule commande.

CONCLUSION

Package It propose une alternative radicale aux gestionnaires de paquets traditionnels en supprimant la couche de confiance du dépôt centralisé. Son approche « fetch from source » et sa configuration modulaire en Lua en font un outil puissant pour les utilisateurs qui souhaitent un contrôle total sur l’origine et la construction de leurs logiciels. Bien que jeune, le projet bénéficie d’une communauté active et d’une architecture pensée pour la simplicité et la portabilité. Pour un administrateur système, c’est une option intéressante pour des environnements où la traçabilité des sources est critique.

Du même canal

Tout voir