Pakiety i Kapsuły (Crate)
Pierwsze części systemu modułów, które omówimy, to pakiety i kapsuły.
Kapsuła (crate) to najmniejsza ilość kodu, jaką kompilator Rust rozważa w danym momencie. Nawet jeśli uruchomisz rustc zamiast cargo i przekażesz pojedynczy plik źródłowy (tak jak zrobiliśmy to w sekcji „Podstawy programu w Rust” w Rozdziale 1), kompilator traktuje ten plik jako kapsułę. Kapsuły mogą zawierać moduły, a moduły mogą być zdefiniowane w innych plikach, które są kompilowane razem z kapsułą, jak zobaczymy w kolejnych sekcjach.
Kapsuła może występować w jednej z dwóch form: kapsuła binarna lub kapsuła biblioteczna. Kapsuły binarne to programy, które można skompilować do pliku wykonywalnego, który można uruchomić, na przykład program wiersza poleceń lub serwer. Każda z nich musi mieć funkcję o nazwie main, która definiuje, co dzieje się, gdy plik wykonywalny jest uruchamiany. Wszystkie kapsuły, które do tej pory utworzyliśmy, były kapsułami binarnymi.
Kapsuły biblioteczne nie mają funkcji main i nie kompilują się do pliku wykonywalnego. Zamiast tego definiują funkcjonalność przeznaczoną do współdzielenia z wieloma projektami. Na przykład, kapsuła rand, której użyliśmy w Rozdziale 2, zapewnia funkcjonalność generowania liczb losowych. Przez większość czasu, gdy Rustaceans mówią „kapsuła”, mają na myśli kapsułę biblioteczną, i używają „kapsuły” zamiennie z ogólną koncepcją programistyczną „biblioteka”.
Katalog główny kapsuły (crate root) to plik źródłowy, od którego kompilator Rust zaczyna i który stanowi moduł główny twojej kapsuły (szczegółowo wyjaśnimy moduły w sekcji „Kontrola zasięgu i prywatności za pomocą modułów”).
Pakiet to zbiór jednej lub więcej kapsuł (crates), które zapewniają zestaw funkcjonalności. Pakiet zawiera plik Cargo.toml, który opisuje, jak zbudować te kapsuły. Cargo jest faktycznie pakietem, który zawiera kapsułę binarną dla narzędzia wiersza poleceń, którego używałeś do budowania swojego kodu. Pakiet Cargo zawiera również kapsułę biblioteczną, od której zależy kapsuła binarna. Inne projekty mogą zależeć od kapsuły bibliotecznej Cargo, aby używać tej samej logiki, której używa narzędzie wiersza poleceń Cargo.
Pakiet może zawierać dowolną liczbę kapsuł binarnych, ale co najwyżej jedną kapsułę biblioteczną. Pakiet musi zawierać co najmniej jedną kapsułę, niezależnie od tego, czy jest to kapsuła biblioteczna, czy binarna.
Przeanalizujmy, co dzieje się, gdy tworzymy pakiet. Najpierw wpisujemy polecenie 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
Po uruchomieniu cargo new my-project używamy ls, aby zobaczyć, co Cargo tworzy. W katalogu my-project znajduje się plik Cargo.toml, dając nam pakiet. Jest też katalog src, który zawiera main.rs. Otwórz Cargo.toml w swoim edytorze tekstu i zauważ, że nie ma tam wzmianki o src/main.rs. Cargo przestrzega konwencji, że src/main.rs jest katalogiem głównym kapsuły binarnej o tej samej nazwie co pakiet. Podobnie, Cargo wie, że jeśli katalog pakietu zawiera src/lib.rs, pakiet zawiera kapsułę biblioteczną o tej samej nazwie co pakiet, a src/lib.rs jest jej katalogiem głównym. Cargo przekazuje pliki katalogu głównego kapsuły do rustc w celu zbudowania biblioteki lub pliku binarnego.
Tutaj mamy pakiet, który zawiera tylko src/main.rs, co oznacza, że zawiera tylko kapsułę binarną o nazwie my-project. Jeśli pakiet zawiera src/main.rs i src/lib.rs, ma dwie kapsuły: binarną i biblioteczną, obie o tej samej nazwie co pakiet. Pakiet może mieć wiele kapsuł binarnych, umieszczając pliki w katalogu src/bin: każdy plik będzie osobną kapsułą binarną.