Phase 5Projet pratique

#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.

Commentaires de documentation
//! # 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.

Commandes de documentation
# 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-items

Sections standards

La communauté Rust utilise des sections conventionnelles dans la documentation :

Sections conventionnelles
/// 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.

Cargo.toml complet
[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 ici

Les 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).

Étapes de publication
# 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 --undo

Vérifications avant publication

Checklist avant de publier
# 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 --list

Versionnement

Rust suit le versionnement sémantique (SemVer) : MAJEUR.MINEUR.PATCH. Chaque partie a une signification précise.

Versionnement sémantique
# 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 publique

Spécifier les dépendances

Versions dans Cargo.toml
[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 :

terminal — cargo
user@stemlegacy:~/my-crate$