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).
Add a comment
If you have a bug/issue with the commenting system, please send me an email (my email is in the "About" section).