Tutoriel pour développer une application en Rust
Envie de créer une app rapide, robuste et moderne ? Ce guide t’emmène pas à pas pour coder en Rust, des bases aux bonnes pratiques pro. Prêt à shipper ?
🎨 illu Tu veux lancer une app propre, rapide et sûre sans te battre avec les bugs mémoire ? Rust te donne des super-pouvoirs… à condition de le prendre dans le bon sens. Voici un vrai pas-à-pas pour passer d’idée à binaire qui tourne.
Pourquoi choisir Rust pour ton app (et quand éviter)
Rust brille par sa sécurité mémoire sans garbage collector, ses perfs proches du C/C++, et un écosystème Cargo hyper carré. Parfait pour des CLI, APIs performantes, outils dev, jeux, ou WebAssembly.
✅ / ❌ en clair :
- ✅ Sécurité mémoire et threads au top (ownership, emprunts) sans runtime lourd.
- ✅ Binaries stand‑alone, cross‑platform, démarrage rapide, faible conso.
- ✅ Outils intégrés (Cargo, tests, formatage, lints) et crates matures.
- ❌ Courbe d’apprentissage plus raide au début (ownership, lifetimes).
- ❌ Compilation parfois plus lente que des langages interprétés.
- ❌ GUI natives moins simples qu’en JS/Swift/Kotlin (mais Tauri/egui aident).
💡 Si tu vises un prototype ultra-rapide d’interface graphique, un framework web JS peut suffire. Pour une CLI, un service perf-sensible ou un module WebAssembly, Rust shine.
Installe Rust et prépare ton environnement en 5 étapes
- Installe rustup (le gestionnaire d’outils officiel). Sur macOS/Linux, passe par le script d’installation rustup depuis le site officiel ; sur Windows, utilise l’installeur rustup-init.
- Sélectionne la toolchain stable : exécute
rustup default stable. - Ajoute les composants qualité :
rustup component add rustfmt clippy. - Éditeur recommandé : VS Code + l’extension rust-analyzer (ou JetBrains Rust).
- Vérifie :
rustc --versionetcargo --versiondoivent répondre.
💡 Astuce productivité: active le formatage à l’enregistrement dans ton éditeur et corrige régulièrement avec
cargo clippypour garder un code propre dès le début.
Crée ton premier projet avec Cargo (structure solide)
- Démarre un binaire:
cargo new mon_app --binpuiscd mon_app. - Fichiers clés:
Cargo.toml(métadonnées, dépendances).src/main.rs(point d’entrée). Pour partager de la logique, créesrc/lib.rset appelle-la depuismain.
- Cycle de dev:
- Lancer:
cargo run(oucargo run -- arg1). - Compiler rapide:
cargo build(debug) etcargo build --release(optimisé). - Tester:
cargo test.
- Lancer:
Bonnes pratiques fondamentales:
- Erreurs: utilise
Result<T, E>et l’opérateur?pour propager proprement. Pour simplifier côté app,anyhowest pratique (contexte d’erreur lisible). - Logs: préfère un logger structuré. Le combo
tracing+tracing-subscriberdonne des logs clairs et filtrables. - Config: sérialise/désérialise avec
serde. Utilise un formatTOMLouYAMLpour ta conf ; charge par env en prod. - Tests: commence par des tests unitaires dans
src/*.rs(blocs#[cfg(test)]) et des tests d’intégration danstests/.
💡 Raccourci mental ownership: une valeur a un propriétaire unique ; emprunter (&) c’est temporaire et sûr ;
mutest explicite. Si le compilateur râle, c’est souvent qu’il t’évite un bug subtil.
Ajoute des features utiles: CLI, HTTP, async, logs
- Arguments en ligne de commande: ajoute
clap(avec la fonctionnalité derive). Tu décris tes options via des attributs, et--helpest généré automatiquement. Lancecargo run -- --helppour vérifier. - Logs structurés: initialise
tracingtôt dansmain(niveau via variable d’env). Exemple d’usage:tracing::info!(user_id = id, "login ok"). - HTTP client:
reqwestmarche très bien, avec JSON viaserde_json. - Async: en réseau, adopte
tokio(runtime async). Tu écriras alors unmainasync (avec l’attribut fourni par la lib) et utiliserasawaitsur les futures. - Erreurs enrichies:
anyhow::Contextpermet d’ajouter du contexte (.context("appel API /users")) pour déboguer facile.
Checklist rapide avant d’aller plus loin:
--helppropre et lisible ?- Messages d’erreur utiles (pas juste “failed”) ?
- Timeout/retry raisonnables côté HTTP ?
- Logs filtrables par niveau ?
Qualité, sécurité et docs: la routine pro
Adopte une boucle de qualité courte et automatique.
- Formatage:
cargo fmt(et auto‑format dans l’IDE). - Lints:
cargo clippy -- -D warningspour traiter les alertes comme des erreurs. - Tests:
cargo testlocalement et en CI. - Audit de dépendances: installe l’outil
cargo-audit, puiscargo auditpour repérer des vulnérabilités connues. - Benchmarks: pour des micro‑benchmarks, regarde
criterion. - Docs: commente avec
///et génère viacargo doc --open; expose une API claire si tu as unelib.
💡 Mets un workflow CI (ex: GitHub Actions) qui lance
fmt,clippy,testetauditsur chaque PR. Tu éviteras les régressions et les failles en douce.
Choisir la bonne cible: compare et décide
Voici un aperçu des cibles fréquentes quand tu développes une application en Rust.
| Cible | Quand l’utiliser | Crates clés | Déploiement | Difficulté |
|---|---|---|---|---|
| CLI | Outils dev, scripts fiables, data tooling | clap, tracing, anyhow | Binaire unique, distribution simple | Facile → Moyen |
| API web | Services rapides, microservices | axum, actix-web, tokio, serde | Container Docker, cloud, systemd | Moyen → Avancé |
| WebAssembly | Front ultra‑rapide, réutiliser du Rust côté web | wasm-bindgen, wasm-pack, Yew/Leptos | Bundler web, CDN | Moyen |
| Desktop | Outils cross‑platform avec UI légère | Tauri, egui, winit | Installers natifs (.msi/.dmg/.deb) | Moyen |
💡 Commence par une CLI: cycle ultra-rapide, surface technique limitée. Migrer ensuite la logique dans une
libte permettra de la réutiliser dans une API ou un binaire GUI.
Compiler, packager et déployer sereinement
- Build optimisé:
cargo build --releasegénère un binaire rapide. Pense à le tester avec des entrées réelles. - Cross‑compilation: ajoute des cibles via
rustup target add <triple>(ex:x86_64-unknown-linux-gnu). Pour simplifier, l’outilcross(basé sur Docker) construit pour d’autres plateformes sans bidouille locale. - Taille de binaire: active l’option de liaison en mode “release” et nettoie les features inutiles des dépendances. Certains projets utilisent aussi des options de strip au packaging.
- Packaging:
- CLI: archive + checksum, ou publication en tant que crate binaire installable via
cargo install --path .(pour l’open‑source). - API: image Docker minimaliste (base légère), variables d’env pour la conf.
- Desktop: génère l’installeur via l’outillage du framework (ex: Tauri propose des outils dédiés).
- CLI: archive + checksum, ou publication en tant que crate binaire installable via
- Observabilité prod: expose des métriques (ex:
metrics+ exporter), niveaux de logs, et un endpoint santé pour les services.
Feuille de route express (30 jours pour être à l’aise)
- Semaine 1: Rust Book (bases), petit outil CLI qui lit/écrit des fichiers, tests unitaires.
- Semaine 2: Ajoute
clap, logstracing, erreursanyhow, confserde+TOML. Publie une première release. - Semaine 3: Découvre l’async avec
tokioet fais un mini client HTTP (reqwest), écris des tests d’intégration. - Semaine 4: Choisis une cible avancée (API ou WASM), mets en place CI complète (
fmt,clippy,test,audit) et documente.
💡 Règle d’or: petit scope, itérations courtes, une nouveauté à la fois. Le compilateur est ton allié: lis ses messages, ils sont pédagogiques.
🙋 FAQ — on répond à tout
Rust est‑il adapté aux débutants ? +
Oui, à condition d’accepter une courbe d’apprentissage plus raide au début (ownership, lifetimes). En échange, tu gagnes en fiabilité et en compréhension profonde du code. Commence par une CLI simple et progresse par étapes.
Quelle différence entre rustup et Cargo ? +
rustup gère les toolchains (versions de Rust, composants comme rustfmt/clippy, cibles). Cargo est l’outil de build/gestion de dépendances/test/packaging. Tu utilises souvent les deux au quotidien.
Comment gérer proprement les erreurs ? +
Utilise `Result<T, E>` et l’opérateur `?` pour propager. Pour une app, `anyhow` simplifie la vie (erreurs typées ou non, chaîne de contexte). Pour une lib publique, préfère des erreurs typées avec `thiserror` pour une API claire.
Rust pour le web côté serveur, je prends quoi ? +
axum ou actix-web sont des choix populaires, tous deux performants. Ajoute `tokio` pour l’async, `serde` pour le JSON, et pense à la configuration (env) et à un logger (`tracing`). Choisis selon l’ergonomie qui te parle le plus.
Je vise le navigateur : que regarder pour WebAssembly ? +
Utilise `wasm-bindgen` et `wasm-pack` pour compiler vers le navigateur. Pour un framework front en Rust, explore Yew ou Leptos. Emballe avec ton bundler web habituel et sers le `.wasm` via un CDN.
T'as kiffé ? Fais tourner ! 🔁
Un partage = un max de love pour la rédac.