Pour essayer CyberTrain sans rien installer, ouvrez le bac à sable :
GitHub Codespaces ouvre le blog du tutoriel, la commande cybertrain et
Spinel 2026.10.27.7020 dans VS Code, dans votre navigateur. La même image tourne aussi en local avec Docker.
Prérequis
- Spinel
2026.10.27.7020(Cybertrain::SPINEL_TAG, la même version queSPINEL_TAGdans .github/workflows/ci.yml), une version de saeki-mototsune/spinel (Cybertrain::SPINEL_REPOSITORY), le fork de matz/spinel qui intègre les corrections dont CyberTrain a besoin avant une version amont ; non testé avec d’autres versions. Vous ne l’installez pas à la main : la commandecybertraincompile cette version dans~/.cybertrainla première fois qu’elle en a besoin (cybertrain setuple fait à la demande), sauf si unspinelde cette version est déjà dans lePATH— voir Comment Spinel est installé. - Pour le compiler : une chaîne de compilation C (
cc, ou le compilateur désigné parCC) etmake— Spinel compile chaque programme en C —, plusgitetcurl. - En-têtes et bibliothèque SQLite 3 (
libsqlite3-devsous Debian/Ubuntu ; fournis avec les Command Line Tools de Xcode sous macOS) — les modèles utilisent directement la FFI de Spinel, pas une gem. - En-têtes et bibliothèque zlib (
zlib1g-devsous Debian/Ubuntu ; dans le SDK de macOS) — les corps de requête gzip (request.decoded_body) sont décompressés par la zlib du système, liée de la même façon. - Ruby 3.2+ et RubyGems, uniquement pour la commande
cybertrain(les applications ne tournent jamais sur CRuby) ; avec Ruby 3.2, la compilation de Spinel demande aussi la gemprism(ci-dessous).
cybertrain doctor vérifie ces outils et en-têtes ainsi que l’installation de
Spinel ; quand un élément requis manque, il affiche aussi la commande
d’installation pour votre plateforme.
Autres paquetsprism avec Ruby 3.2 ; OpenSSL et jemalloc, facultatifs
- La compilation de Spinel demande la gem
prismde Ruby, que Ruby 3.3 et plus récent incluent ; avec Ruby 3.2,gem install prism(avec les en-têtes de développement de Ruby,ruby-devsous Debian/Ubuntu).cybertrain doctorle vérifie. - Les en-têtes OpenSSL (
libssl-dev) sont facultatifs : sans eux, Spinel est compilé sans son paquetopenssl, que CyberTrain n’utilise pas. Sous macOS, une application qui requiertopenssla besoin de l’OpenSSL de Homebrew (keg-only) dans les chemins du compilateur :export LIBRARY_PATH="$(brew --prefix openssl@3)/lib" CPATH="$(brew --prefix openssl@3)/include". - Le paquet de développement de jemalloc (
libjemalloc-dev;brew install jemalloc) est facultatif : une application n’en a besoin qu’une fois que sonspin.tomlindiqueallocator = "jemalloc", ligne quecybertrain newécrit en commentaire. Cela vaut la peine de l’activer en production : de 1,1 à 1,4 fois plus de requêtes par seconde sur examples/blog (docs/benchmark.md).
Installer la CLI
gem install cybertrain
cybertrain doctor
La première ligne installe la commande depuis RubyGems et la seconde vérifie les
prérequis ; le tutoriel continue à
partir de là, de cybertrain new à cybertrain build.
La commande cybertrain
cybertrain help affiche ces commandes :
cybertrain new NAME [--path DIR | --version V | --git URL [--ref R]] [--skip-spin]crée une application dans NAME, puis y lancespin locketspin run gen, en installant d’abord Spinel si nécessaire.cybertrain generate scaffold NAME field:type ...(aliasg scaffold) ajoute une ressource à l’application du répertoire courant.cybertrain generate authenticationy ajoute la connexion par adresse e-mail et mot de passe : les tables users et sessions, les modèlesUseretSession, les contrôleurs et vues de connexion et d’inscription, les routes, unbefore_actiondansApplicationControlleret un test (voir Ajouter la connexion). Avec--invite-only, il n’y a pas de page d’inscription : les utilisateurs sont créés avec./NAME user EMAIL, et le premier aussi sur une page/setupqui ne répond qu’à la machine du serveur elle-même, avec le jeton à usage unique qu’affiche son avertissement de démarrage, tant qu’aucun utilisateur n’existe.cybertrain generate attachment MODEL FIELD [--any]ajoute l’envoi d’un fichier à un modèle généré par scaffold : cinq colonnes de métadonnées, des méthodes et callbacks de modèle, une action de téléchargement, la route, le champ de formulaire et un test (voir Ajouter une image de couverture). Un champ de scaffoldcover:attachmentfait la même chose.cybertrain db migrategénère, applique les migrations en attente, puis génère à nouveau (spin run gen; spin run db -- migrate; spin run gen) ;cybertrain migrationest conservé comme alias.cybertrain db COMMAND...lance toute autre commande de base de données aprèsspin run gen:status,rollback [N](qui génère à nouveau ensuite),schema:dump,create.cybertrain server [PORT]génère, puis démarre le serveur de développement (spin run gen; spin run NAME, ouspin run NAME -- PORT; port 3000 par défaut).cybertrain buildcompile NAME avecapp/views/intégré et assembledist/(le binaire,public/,storage/,tmp/).cybertrain spin ARGS...lancespinavec le Spinel épinglé, depuis n’importe quel répertoire (cybertrain spin test,cybertrain spin run gen -- --check).cybertrain setup [--force]installe Spinel2026.10.27.7020dans~/.cybertrain, sauf si unspinelde cette version est déjà dans lePATH;--forcerecompile la copie sous~/.cybertrain.cybertrain doctorvérifie la chaîne de compilation C, les en-têtes SQLite et l’installation de Spinel.cybertrain versionaffiche la version.
db, server et build s’exécutent dans une application ; NAME est le
[package] name de son spin.toml.
Comment Spinel est installé
Chaque commande qui lance spin (new, db, server, build, spin)
s’assure d’abord qu’un Spinel de la version de Cybertrain::SPINEL_TAG est
disponible. Un spinel du PATH (accompagné d’un spin) dont
spinel --version indique cette version est utilisé tel quel ; sinon, la
copie que cybertrain conserve sous ~/.cybertrain/spinel/2026.10.27.7020/
est utilisée ; sinon, cybertrain compile cette copie à partir du tag de
version de Cybertrain::SPINEL_REPOSITORY (git clone, make deps,
make -j, make install PREFIX=...), une seule fois, en quelques minutes. Le
journal de compilation est ~/.cybertrain/log/spinel-2026.10.27.7020-build.log
(ses dernières lignes sont affichées si une étape échoue).
S’il manque un
outil nécessaire à la compilation, cybertrain indique lequel et affiche la
commande d’installation pour votre plateforme avant de commencer. Un spinel
d’une autre version présent dans le PATH n’est jamais utilisé ni
modifié : cybertrain conserve sa propre copie (et le signale quand il
l’installe).
cybertrain setup fait la même chose à la demande et, chaque fois que c’est sa
propre copie qui est utilisée, affiche la ligne qui la place dans le PATH,
pour lancer spin vous-même :
export PATH="$HOME/.cybertrain/bin:$PATH"
~/.cybertrain/bin contient des liens spinel et spin vers la version
utilisée, la ligne reste donc valable après un changement de version ;
cybertrain spin ... n’a besoin d’aucun PATH.
Variables d’environnementCYBERTRAIN_HOME déplace ~/.cybertrain, CYBERTRAIN_SPINEL_HOME utilise une installation existante
Deux variables d’environnement remplacent tout cela :
CYBERTRAIN_HOMEremplace~/.cybertrain(un chemin sans espaces, guillemets,$ni:, que le Makefile de Spinel et lePATHne supportent pas).CYBERTRAIN_SPINEL_HOME=PREFIXimpose une installation existante :cybertrainutilise alors lespinelet lespindePREFIX/bin(ou dePREFIXlui-même, sispinels’y trouve directement) et s’arrête sur une erreur s’ils ne sont pas de cette version.
La gem et le framework
gem install cybertrain installe une commande, pas le framework. La gem est la
commande cybertrain, du Ruby pur qui s’exécute sur votre machine sous CRuby
(3.2 ou plus récent) et appelle pour vous l’outil spin de Spinel ; ni le
framework ni Spinel ne sont dans la gem. Le framework est un paquet Spinel dont
votre application dépend dans son spin.toml : Spinel le compile à
l’avance avec votre code, il ne tourne donc jamais sur CRuby, et c’est la partie
qui est livrée. Le binaire de dist/ tourne sans Ruby, sans la gem et sans
Spinel.
Ce que cybertrain new écrit
cybertrain new écrit l’application avec un spin.toml qui pointe vers la
version correspondant à la CLI (cybertrain = { git =
"https://github.com/saeki-mototsune/cybertrain", ref = "v0.3.1" }), s’assure
que Spinel est installé, puis lance spin lock (spin récupère le framework dans
son cache, ~/.cache/spin/packages/, et épingle le commit dans spin.lock) et
spin run gen, un peu comme rails new lance bundle install, et affiche les
étapes suivantes. Rien du framework n’est copié dans l’application ;
commitez spin.toml et spin.lock.
Si Spinel ou l’une des deux étapes spin échoue, les fichiers restent en
place, new sort avec le code 1 et affiche ce qu’il faut lancer une fois la
cause corrigée (pour Spinel : cybertrain setup, puis
cybertrain spin lock && cybertrain spin run gen dans le nouveau répertoire).
Quatre options changent ce qu’elle écrit et lance :
--skip-spinse contente d’écrire les fichiers : pas d’installation de Spinel, pas despin lock, pas despin run gen.--path DIRfait plutôt dépendre l’application d’une copie locale du dépôt (--path ~/src/cybertrain, là où se trouve la copie, pour travailler sur CyberTrain lui-même).--git URL [--ref R]fait dépendre l’application du framework situé à URL (à la branche ou au tag R).--version Vfait dépendre l’application d’une version de l’index, une fois que le framework sera sur unspin-index.
N’indiquez qu’une seule des options --path, --version et --git ;
--ref exige --git.
Passer une application à une nouvelle version
La gem et le framework sont publiés à partir du même tag, leurs versions
correspondent donc : la gem 0.3.1 crée des applications qui dépendent du
framework v0.3.1. Pour passer une application à une nouvelle version, mettez
à jour la gem, faites pointer spin.toml vers le nouveau tag, puis lancez, dans
l’application :
cybertrain spin lock
cybertrain spin run gen