Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Les packages et les crates

Les premières parties du système de modules que nous aborderons sont les packages et les crates.

Une crate est la plus petite quantité de code que le compilateur Rust prend en compte à la fois. Même si vous exécutez rustc plutôt que cargo et que vous passez un seul fichier de code source (comme nous l’avons fait au tout début dans [« Les bases d’un programme Rust »][basics] au chapitre 1), le compilateur considère ce fichier comme une crate. Les crates peuvent contenir des modules, et les modules peuvent être définis dans d’autres fichiers qui sont compilés avec la crate, comme nous le verrons dans les sections suivantes.

Une crate peut se présenter sous l’une des deux formes suivantes : une crate binaire ou une crate de bibliothèque. Les crates binaires sont des programmes que vous pouvez compiler en un exécutable que vous pouvez lancer, comme un programme en ligne de commande ou un serveur. Chacune doit avoir une fonction appelée main qui définit ce qui se passe lorsque l’exécutable s’exécute. Toutes les crates que nous avons créées jusqu’à présent étaient des crates binaires.

Les crates de bibliothèque n’ont pas de fonction main et ne se compilent pas en exécutable. À la place, elles définissent des fonctionnalités destinées à être partagées avec plusieurs projets. Par exemple, la crate rand que nous avons utilisée au [chapitre 2][rand] fournit des fonctionnalités qui génèrent des nombres aléatoires. La plupart du temps, quand les Rustacés disent « crate », ils veulent dire crate de bibliothèque, et ils utilisent « crate » de manière interchangeable avec le concept général de programmation de « bibliothèque ».

La racine de la crate (crate root) est un fichier source à partir duquel le compilateur Rust commence et qui constitue le module racine de votre crate (nous expliquerons les modules en détail dans [« Contrôler la portée et la confidentialité avec les modules »][modules]).

Un package est un ensemble d’une où plusieurs crates qui fournit un ensemble de fonctionnalités. Un package contient un fichier Cargo.toml qui décrit comment compiler ces crates. Cargo est en fait un package qui contient la crate binaire pour l’outil en ligne de commande que vous avez utilisé pour compiler votre code. Le package Cargo contient également une crate de bibliothèque dont la crate binaire dépend. D’autres projets peuvent dépendre de la crate de bibliothèque de Cargo pour utiliser la même logique que l’outil en ligne de commande Cargo.

Un package peut contenir autant de crates binaires que vous le souhaitez, mais au maximum une seule crate de bibliothèque. Un package doit contenir au moins une crate, que ce soit une crate de bibliothèque ou une crate binaire.

Voyons ce qui se passe lorsque nous créons un package. Tout d’abord, nous entrons la commande cargo new my-project :

$ cargo new my-project
     Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

Après avoir exécuté cargo new my-project, nous utilisons ls pour voir ce que Cargo crée. Dans le répertoire my-project, il y à un fichier Cargo.toml, ce qui nous donne un package. Il y a aussi un répertoire src qui contient main.rs. Ouvrez Cargo.toml dans votre éditeur de texte et notez qu’il n’y à aucune mention de src/main.rs. Cargo suit une convention selon laquelle src/main.rs est la racine de la crate binaire portant le même nom que le package. De même, Cargo sait que si le répertoire du package contient src/lib.rs, le package contient une crate de bibliothèque portant le même nom que le package, et src/lib.rs est sa racine de crate. Cargo passe les fichiers racines de crate à rustc pour compiler la bibliothèque ou le binaire.

Ici, nous avons un package qui ne contient que src/main.rs, ce qui signifie qu’il ne contient qu’une crate binaire nommée my-project. Si un package contient src/main.rs et src/lib.rs, il a deux crates : une binaire et une de bibliothèque, toutes deux portant le même nom que le package. Un package peut avoir plusieurs crates binaires en plaçant des fichiers dans le répertoire src/bin : chaque fichier sera une crate binaire distincte.