- Introduction
- Qu'est-ce que Cargo.lock ?
- Différence avec Cargo.toml
- Structure du Fichier
- Génération et Mise à Jour
- Gestion dans Git
- Versions et Résolution de Dépendances
- Checksums et Sécurité
- FAQ
Cargo.lock est un fichier généré automatiquement par Cargo qui verrouille les versions exactes de toutes les dépendances de votre projet. Il garantit que tous les développeurs et tous les environnements de build utilisent exactement les mêmes versions de toutes les bibliothèques.
- ✅ Généré automatiquement : Cargo crée et met à jour ce fichier
- ✅ Ne pas éditer manuellement : Le fichier contient un avertissement à ce sujet
- ✅ Reproductibilité : Garantit des builds reproductibles
- ✅ Sécurité : Contient des checksums pour vérifier l'intégrité
Cargo.lock est un fichier de verrouillage des dépendances qui enregistre :
- Versions exactes de toutes les dépendances (directes et transitives)
- Checksums pour vérifier l'intégrité des téléchargements
- Sources des dépendances (crates.io, Git, chemin local, etc.)
- Arbre de dépendances complet avec toutes les relations
[[package]]
name = "egui"
version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abc123def456..."
dependencies = [
"egui_derive",
"epaint",
]Rôle : Déclare les dépendances que vous voulez utiliser
Exemple :
[dependencies]
egui = "0.27" # Version flexible (0.27.0 à <0.28.0)
serde = "1.0" # Version flexible (1.0.0 à <2.0.0)Caractéristiques :
- ✅ Édité manuellement : Vous modifiez ce fichier
- ✅ Versions flexibles : Spécifie une plage de versions acceptables
- ✅ Dépendances directes : Seulement ce que vous déclarez explicitement
- ✅ Commiter dans Git : Toujours commiter ce fichier
Rôle : Verrouille les versions exactes utilisées
Exemple :
[[package]]
name = "egui"
version = "0.27.2" # Version exacte
checksum = "abc123..."Caractéristiques :
- ✅ Généré automatiquement : Cargo le crée et le met à jour
- ✅ Versions exactes : Spécifie la version précise utilisée
- ✅ Toutes les dépendances : Directes ET transitives (dépendances des dépendances)
⚠️ Commiter selon le type de projet : Voir section "Gestion dans Git"
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4- Commentaire d'avertissement : Indique que le fichier est généré automatiquement
- Version du format : Version 4 est le format actuel (depuis Rust 1.68)
Chaque dépendance est décrite dans une section [[package]] :
[[package]]
name = "egui" # Nom du crate
version = "0.27.2" # Version exacte
source = "registry+https://github.com/rust-lang/crates.io-index" # Source
checksum = "abc123def456..." # Checksum SHA256
dependencies = [ # Dépendances de ce package
"egui_derive",
"epaint",
]Champs principaux :
| Champ | Description | Exemple |
|---|---|---|
name |
Nom du crate | "egui" |
version |
Version exacte | "0.27.2" |
source |
Source du package | "registry+https://..." |
checksum |
Hash SHA256 pour vérification | "abc123..." |
dependencies |
Liste des dépendances | ["egui_derive"] |
1. Registry (crates.io) :
source = "registry+https://github.com/rust-lang/crates.io-index"2. Git :
source = "git+https://github.com/user/repo.git#commit_hash"3. Chemin local :
source = "path+file:///path/to/local/crate"4. Workspace :
source = "workspace"[[package]]
name = "mini_sheet"
version = "0.1.0"
dependencies = [
"eframe",
"egui",
"serde",
"serde_json",
"rfd",
]
[[package]]
name = "eframe"
version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "def456..."
dependencies = [
"egui",
"winit",
]
[[package]]
name = "egui"
version = "0.27.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abc123..."
dependencies = [
"egui_derive",
"epaint",
]Cargo.lock est créé automatiquement lors de la première compilation :
cargo build # Crée Cargo.lock si absent
cargo run # Crée Cargo.lock si absent
cargo test # Crée Cargo.lock si absentCargo met à jour Cargo.lock automatiquement quand :
- Vous modifiez
Cargo.toml: Ajout/suppression/modification de dépendances - Vous exécutez
cargo update: Met à jour les dépendances dans les limites deCargo.toml - Les dépendances changent : Si une dépendance transitive est mise à jour
Mettre à jour toutes les dépendances :
cargo updateMettre à jour une dépendance spécifique :
cargo update -p eguiMettre à jour uniquement les dépendances directes :
cargo update --precise 0.27.2 -p eguiForcer la régénération :
rm Cargo.lock
cargo buildPour les applications binaires (exécutables, CLI tools) :
✅ COMMITER Cargo.lock
Pourquoi ?
- Garantit que tous les builds utilisent les mêmes versions
- Assure la reproductibilité
- Évite les surprises lors des déploiements
Exemple : MiniSheet est une application, donc Cargo.lock doit être commité.
Pour les bibliothèques (crates publiées sur crates.io) :
❌ NE PAS COMMITER Cargo.lock
Pourquoi ?
- Les utilisateurs de votre bibliothèque doivent pouvoir utiliser différentes versions
- Le verrouillage est géré par les applications qui utilisent votre bibliothèque
- Évite les conflits de versions
Exception : Si votre bibliothèque a un binaire (exécutable), vous pouvez commiter Cargo.lock pour cet exécutable.
Pour une application (à commiter) :
# Ne PAS ignorer Cargo.lock pour les applications
# Cargo.lockPour une bibliothèque (à ignorer) :
# Ignorer Cargo.lock pour les bibliothèques
Cargo.lockgit ls-files Cargo.lock # Affiche le fichier s'il est suivi
git check-ignore Cargo.lock # Affiche la règle si ignoréCargo résout les versions en suivant ces règles :
- Lire
Cargo.toml: Détermine les plages de versions acceptables - Lire
Cargo.lock(si présent) : Utilise les versions verrouillées - Résoudre les conflits : Trouve des versions compatibles pour toutes les dépendances
- Mettre à jour
Cargo.lock: Enregistre les versions choisies
Cargo.toml :
[dependencies]
egui = "0.27" # Accepte 0.27.0 à <0.28.0Cargo résout :
egui = "0.27.2"(dernière version compatible)- Enregistre dans
Cargo.lock
Si Cargo.lock existe déjà :
- Utilise
egui = "0.27.1"(version verrouillée) - Ne change pas sauf si vous exécutez
cargo update
Si deux dépendances requièrent des versions incompatibles :
Exemple :
crate_anécessiteegui = "0.27"crate_bnécessiteegui = "0.28"
Cargo :
- Tente de trouver une version compatible
- Si impossible, affiche une erreur
- Vous devez mettre à jour les dépendances
Un checksum est un hash cryptographique (SHA256) qui vérifie l'intégrité d'un fichier téléchargé.
[[package]]
name = "egui"
version = "0.27.2"
checksum = "abc123def456789..."Fonctions :
- Vérification d'intégrité : S'assure que le fichier n'a pas été corrompu
- Sécurité : Détecte les modifications malveillantes
- Reproductibilité : Garantit que le même contenu est téléchargé
-
Premier téléchargement :
- Cargo télécharge le crate depuis crates.io
- Calcule le SHA256 du fichier
- Enregistre le checksum dans
Cargo.lock
-
Téléchargements suivants :
- Cargo télécharge le crate
- Calcule le SHA256
- Compare avec le checksum dans
Cargo.lock - Si différent → erreur (fichier corrompu ou modifié)
[net]
offline = falseOu dans ~/.cargo/config.toml :
[net]
git-fetch-with-cli = trueR: Techniquement oui, mais fortement déconseillé. Cargo le régénérera lors de la prochaine compilation et écrasera vos modifications. Utilisez plutôt cargo update ou modifiez Cargo.toml.
R: Il contient :
- Toutes les dépendances directes ET transitives
- Les checksums de chaque package
- Les métadonnées complètes
Pour MiniSheet avec 5 dépendances directes, Cargo.lock peut contenir 100+ dépendances transitives.
R:
# Supprimer et régénérer
rm Cargo.lock
cargo buildR: Non, sauf si votre bibliothèque contient aussi un exécutable. Les bibliothèques ne doivent généralement pas commiter Cargo.lock.
R:
# Mettre à jour une dépendance spécifique
cargo update -p egui
# Mettre à jour toutes les dépendances
cargo updateR: Cela signifie que le fichier téléchargé ne correspond pas au checksum enregistré. Causes possibles :
- Fichier corrompu lors du téléchargement
- Source compromise (rare)
- Cache corrompu
Solution :
cargo clean
cargo update
cargo buildR: C'est normal ! Différentes dépendances peuvent nécessiter différentes versions d'une même bibliothèque. Cargo les compile séparément et les lie ensemble.
Exemple :
[[package]]
name = "crate_a"
dependencies = ["serde 1.0"]
[[package]]
name = "crate_b"
dependencies = ["serde 1.1"]Cargo compile serde 1.0 et serde 1.1 séparément.
R:
# Arbre complet
cargo tree
# Arbre pour une dépendance spécifique
cargo tree -p egui
# Arbre inversé (qui dépend de quoi)
cargo tree --invert -p eguiR: Cargo résoudra automatiquement lors de la prochaine compilation. Si vous voulez forcer la mise à jour :
cargo updateR: Oui, mais Cargo le recréera lors de la prochaine compilation. Utile pour :
- Forcer la résolution des dépendances
- Corriger un fichier corrompu
- Réinitialiser les versions
R: Les dépendances provenant de :
- Chemins locaux (
path = "...") - Workspaces
- Git (dans certains cas)
N'ont pas de checksum car elles ne sont pas téléchargées depuis un registre.
# Voir l'arbre de dépendances
cargo tree
# Mettre à jour toutes les dépendances
cargo update
# Mettre à jour une dépendance spécifique
cargo update -p egui
# Mettre à jour vers une version précise
cargo update --precise 0.27.2 -p egui
# Voir les dépendances obsolètes
cargo outdated
# Régénérer Cargo.lock
rm Cargo.lock
cargo build
# Vérifier sans compiler
cargo check
# Voir les métadonnées d'un package
cargo metadata| Aspect | Description |
|---|---|
| Génération | Automatique lors de cargo build |
| Édition | ❌ Ne pas éditer manuellement |
| Git (Application) | ✅ Commiter |
| Git (Bibliothèque) | ❌ Ignorer |
| Taille | Variable (dépend du nombre de dépendances) |
| Format | TOML avec sections [[package]] |
| Versions | Versions exactes (pas de plages) |
| Sécurité | Checksums SHA256 pour vérification |
Pour le projet MiniSheet :
Cargo.toml :
[dependencies]
eframe = "0.27"
egui = "0.27"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
rfd = "0.14"Cargo.lock contient :
- Ces 5 dépendances directes
- ~100+ dépendances transitives (toutes les dépendances de egui, serde, etc.)
- Checksums pour toutes
- Versions exactes verrouillées
Action : ✅ Commiter Cargo.lock car MiniSheet est une application binaire.
Dernière mise à jour : 2026-01-20