10. Les crates▲
Une crate
est une unité de compilation en Rust. Lorsque rustc some_file.rs est appelé, some_file.rs est considéré comme étant un «fichier paquet» (i.e. un fichier fédérant les autres). Si some_file.rs possède plusieurs modules en son sein, chacun d'entre eux verra son contenu fusionné dans ce paquet avant que la compilation n'ait lieu. Autrement dit, les modules ne sont pas compilés individuellement, mais en tant que paquet, en tant qu'ensemble de ressources.
Une crate
peut être compilée en tant qu'exécutable ou bibliothèque. Par défaut, rustc produira un exécutable mais cela peut être modifié en passant le flag --crate
-type
au compilateur.
10-1. Créer une bibliothèque▲
Commençons par créer une bibliothèque dont nous nous servirons ensuite pour l'importer dans une autre crate
.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// Dans le fichier rary.rs
pub
fn
public_function() {
println!
("called rary's `public_function()`"
);
}
fn
private_function() {
println!
("called rary's `private_function()`"
);
}
pub
fn
indirect_access() {
print!
("called rary's `indirect_access()`, that
\n
> "
);
private_function();
}
$
rustc --crate-type
=
lib rary.rs
$
ls lib*
library.rlib
Les bibliothèques sont préfixées par la séquence « lib » et possèdent, par défaut, le nom du fichier utilisé pour créer la crate (en l'occurrence rary.rs). Ce comportement peut, bien entendu, être modifié en utilisant l'attribut crate_name.
10-2. La déclaration extern crate▲
Pour importer une crate
à cette nouvelle bibliothèque, il vous faudra utiliser la déclaration extern
crate
. Cette déclaration a aussi pour effet d'importer toutes les ressources sous un même module, possédant le même nom que la bibliothèque. Les règles régissant la visibilité des ressources s'appliquent également aux modules des bibliothèques importées.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// Dans le fichier executable.rs
// On importe la bibliothèque `library` et ses ressources
// sous un module nommé `rary`.
extern
crate
rary;
fn
main() {
rary::public_function();
// Error! `private_function` est privée.
// rary::private_function();
rary::indirect_access();
}
2.
3.
4.
5.
6.
# Où `library.rlib` est le chemin de la bibliothèque compilée, nous admetterons ici
# que la bibliothèque se trouve dans le répertoire courant.
$
rustc executable.rs --extern rary
=
library.rlib &&
./executable
called rary′s `public_function()`
called rary′s `indirect_access()`
, that
>
called rary′s `private_function()`