1 mai 2019

Meuse, a free Rust private Registry

English version here
Je m’étais intéressé à Rust à sa sortie en version 1.0. Après avoir pas mal joué avec, j’ai un peu mis de côté ce langage pour me consacrer à d’autres choses. Mais une phrase de la release note de la version 1.34 m’a interpellé: You can now use alternative registries to crates.io. J’avais trouvé mon prochain projet: écrire un registry.

Meuse, un registry pour vos crates

Meuse est un registry écrit en Clojure. Mon objectif est de fournir un registry simple à déployer et à administrer. Le code est disponible sur Github.

Le statut du projet est actuellement ça marche sur ma machine. il reste beaucoup de travail à faire, le code doit être remanié et beaucoup mieux testé. Toute la partie concernant l’authentification et la gestion des tokens est manquante.

Mon premier objectif était de poser les bases du projet de voir un peu les difficultés que j’allais rencontrer. Mais j’ai déjà quelque chose d’intéressant:

cargo publish --allow-dirty --registry custom
    Updating `https://github.com/mcorbin/testregistry.git` index
warning: manifest has no license, license-file, documentation, homepage or repository.
See <http://doc.crates.io/manifest.html#package-metadata> for more info.
   Packaging testpublish v0.1.13 (/home/mathieu/prog/rust/testpublish)
   Verifying testpublish v0.1.13 (/home/mathieu/prog/rust/testpublish)
   Compiling testpublish v0.1.13 (/home/mathieu/prog/rust/testpublish/target/package/testpublish-0.1.13)

cargo yank --vers 0.1.13 --registry custom
    Updating `https://github.com/mcorbin/testregistry.git` index
        Yank testpublish:0.1.13

cargo yank --undo --vers 0.1.13 --registry custom
    Updating `https://github.com/mcorbin/testregistry.git` index
      Unyank testpublish:0.1.13

cargo owner --add user1 --registry custom    Updating `https://github.com/mcorbin/testregistry.git` index
       Owner added user(s) user1 as owner(s) of crate testpublish

cargo owner --list --registry custom
    Updating `https://github.com/mcorbin/testregistry.git` index
user1 (user1)

cargo owner --remove user1 --registry custom
    Updating `https://github.com/mcorbin/testregistry.git` index
       Owner removing ["user1"] from crate testpublish

cargo search --registry custom "project" -v
testpublish = "0.1.13"    # This is a description of my project

Je peux aussi récupérer des dépendances depuis le registry ;)

Fonctionnement

Meuse utilise PostgreSQL comme base de données (crates et versions, categories, utilisateurs…​). La recherche (très basique pour l’instant) est également implémentée grâce au type TSVECTOR de PostgreSQL.

Les registries Rust utilisent également un repository Git pour stocker les metadata des crates (versions, est ce qu’une crate est yanked ou non…​ cf la documentation). Meuse va donc également intéragir avec un repository Git quand une crate est publiée ou "yankée".

Enfin, les fichiers crates contenant le code source sont également gérés par Meuse qui se charge de les sauvegarder sur disque et de les exposer via HTTP (mais je prévois quelques fonctionnalités de ce côté là, comme par exemple le fait de pouvoir pousser les crates sur un object store compatible S3).

Donc si vous avez une instance PostgreSQL, déployer votre registry ne sera que lancer un java -jar.

La suite

Le prochain mois sera consacré à stabiliser le projet, réécrire ce qui doit être réécrit, et ajouter la gestion des tokens,

En plus de l’API crate utilisée par cargo, une autre API (que j’ai déjà commencé) permettra de gérer les catégories de vos crates, les utilisateurs etc…​

Je pense également que j’écrirais une CLI pour intéragir avec le projet. Par contre, je ne ferais pas d’interface graphique (je suis trop mauvais en front et cela ne m’intéresse pas vraiment), libre à vous de faire ça de votre côté si vous êtes motivés ;)

J’espère pouvoir sortir une version à peu près fonctionnel avec un peu de documentation pour la fin du mois.

Appendice: pourquoi Clojure ?

Comme dit précédement, Meuse est écrit en Clojure. Parmis tous les langages que j’ai utilisé Clojure est celui où je suis le plus productif.

L’écosystème est très riche, avec des librairies de grandes qualitées (comme Aleph ou HoneySQL), et la façon de travailler avec le REPL (un reloaded workflow avec Mount dans mon cas, qui fera d’ailleurs l’objet d’un article un jour ou l’autre) est géniale.

On rajoute à ça un langage extrêmement bien designé, l’immutabilité, il y a de quoi être heureux (et non, le typage statique ne me manque pas).

Tags: clojure rust
Top of page