#20 Publier
cargo publish, docs, crates.io
Commentaires de documentation
En Rust, les commentaires de documentation utilisent /// (pour les éléments) ou //! (pour le module/crate). Ils supportent le format Markdown et sont compilés en pages HTML par cargo doc.
//! # My Crate
//!
//! Une bibliothèque d'exemple pour apprendre à publier sur crates.io.
//!
//! ## Utilisation rapide
//!
//! ```rust
//! use my_crate::addition;
//! let resultat = addition(2, 3);
//! assert_eq!(resultat, 5);
//! ```
/// Additionne deux nombres entiers.
///
/// # Arguments
///
/// * `a` - Le premier nombre
/// * `b` - Le second nombre
///
/// # Exemples
///
/// ```
/// use my_crate::addition;
///
/// let resultat = addition(2, 3);
/// assert_eq!(resultat, 5);
/// ```
///
/// # Panics
///
/// Cette fonction ne panique jamais.
pub fn addition(a: i32, b: i32) -> i32 {
a + b
}Les blocs de code dans /// Exemples sont exécutés comme des tests par cargo test. C'est ce qu'on appelle les doc tests : votre documentation est toujours à jour !
Générer la doc
La commande cargo doc génère une documentation HTML complète pour votre crate et toutes ses dépendances.
# Générer la documentation
$ cargo doc
# Générer et ouvrir dans le navigateur
$ cargo doc --open
# Générer seulement pour votre crate (pas les dépendances)
$ cargo doc --no-deps
# Vérifier que la documentation compile sans warnings
$ cargo doc --document-private-itemsSections standards
La communauté Rust utilise des sections conventionnelles dans la documentation :
/// Divise deux nombres.
///
/// # Arguments
///
/// * `numerateur` - Le nombre à diviser
/// * `denominateur` - Le diviseur
///
/// # Returns
///
/// Le résultat de la division, ou `None` si le dénominateur est zéro.
///
/// # Exemples
///
/// ```
/// let resultat = my_crate::diviser(10, 2);
/// assert_eq!(resultat, Some(5));
/// ```
///
/// # Panics
///
/// Ne panique pas (utilise Option à la place).
///
/// # Errors
///
/// Retourne `None` si le dénominateur est zéro.
///
/// # Safety
///
/// (pour les fonctions unsafe uniquement)
pub fn diviser(numerateur: i32, denominateur: i32) -> Option<i32> {
if denominateur == 0 {
None
} else {
Some(numerateur / denominateur)
}
}Métadonnées Cargo.toml
Avant de publier, votre Cargo.toml doit contenir les métadonnées requises par crates.io.
[package]
name = "my-crate"
version = "0.1.0"
edition = "2021"
# Métadonnées obligatoires pour publier
description = "Une bibliothèque d'exemple pour apprendre Rust"
license = "MIT OR Apache-2.0"
# Métadonnées recommandées
authors = ["Votre Nom <email@example.com>"]
repository = "https://github.com/user/my-crate"
homepage = "https://github.com/user/my-crate"
documentation = "https://docs.rs/my-crate"
readme = "README.md"
keywords = ["exemple", "apprentissage"] # max 5
categories = ["development-tools"]
# Exclure des fichiers du package
exclude = ["tests/*", ".github/*"]
[dependencies]
# vos dépendances iciLes champs name, version, description et license sont obligatoires pour publier sur crates.io.
Publier sur crates.io
Publier un crate le rend disponible à toute la communauté Rust. Attention : une version publiée ne peut jamais être supprimée, seulement dépubliée (yank).
# 1. Créer un compte sur crates.io (via GitHub)
# Récupérer votre token API sur https://crates.io/settings/tokens
# 2. Se connecter depuis le terminal
$ cargo login votre-token-api
# 3. Vérifier que le package est valide
$ cargo package
# 4. Tester la publication sans envoyer
$ cargo publish --dry-run
# 5. Publier pour de vrai !
$ cargo publish
# Dépublier une version (les gens ne pourront plus l'ajouter)
$ cargo yank --version 0.1.0
# Annuler la dépublication
$ cargo yank --version 0.1.0 --undoVérifications avant publication
# Vérifier que tout compile
$ cargo check
# Exécuter tous les tests (y compris les doc tests)
$ cargo test
# Vérifier les warnings du compilateur
$ cargo clippy
# Vérifier le formatage
$ cargo fmt --check
# Vérifier que le package est complet
$ cargo package --listVersionnement
Rust suit le versionnement sémantique (SemVer) : MAJEUR.MINEUR.PATCH. Chaque partie a une signification précise.
# Format : MAJEUR.MINEUR.PATCH
# PATCH (0.1.0 -> 0.1.1)
# - Corrections de bugs
# - Aucun changement d'API
# Exemple : corriger un calcul erroné
# MINEUR (0.1.0 -> 0.2.0)
# - Nouvelles fonctionnalités
# - Rétrocompatible (l'ancien code fonctionne toujours)
# Exemple : ajouter une nouvelle fonction
# MAJEUR (0.1.0 -> 1.0.0)
# - Changements incompatibles
# - L'ancien code peut ne plus compiler
# Exemple : renommer une fonction publiqueSpécifier les dépendances
[dependencies]
# Version exacte
serde = "=1.0.193"
# Compatible (par défaut) : ^1.0.193
# Accepte 1.0.194, 1.1.0, mais pas 2.0.0
serde = "1.0.193"
# Au moins cette version mineure
serde = "~1.0.193" # accepte 1.0.x seulement
# N'importe quelle version 1.x
serde = "1"
# Plage de versions
serde = ">=1.0, <2.0"La commande cargo update met à jour les dépendances dans les limites définies par votre Cargo.toml, et enregistre les versions exactes dans Cargo.lock.
À vous de jouer
Essayez les commandes ci-dessous pour générer la documentation et préparer la publication :