Packages dan Crates
Bagian pertama dari sistem modul yang bakal kita bahas adalah packages (paket) dan crates.
Sebuah crate adalah jumlah kode paling kecil yang dipertimbangkan sama compiler
Rust dalam satu waktu. Walaupun kita jalanin rustc bukannya cargo terus
masukin satu file source code (kayak yang kita lakuin dulu sekali di “Menulis
dan Menjalankan Program Rust” di Bab 1), compiler nganggep file itu sebagai
sebuah crate. Crates bisa isinya modul, dan modul itu mungkin didefinisikan di
file lain yang bakal di-compile barengan sama crate-nya, kayak yang bakal kita
liat di bagian-bagian selanjutnya.
Sebuah crate bisa dateng dalam salah satu dari dua bentuk: sebuah binary crate
atau sebuah library crate. Binary crates adalah program yang bisa kita
compile jadi executable yang bisa dijalanin, kayak program command line
atau sebuah server. Masing-masing harus punya fungsi namanya main yang
nentuin apa yang terjadi pas program executable itu jalan. Semua crates yang
udah kita bikin sejauh ini adalah binary crates.
Library crates nggak punya fungsi main, dan mereka nggak di-compile jadi
executable. Sebaliknya, mereka mendefinisikan fungsionalitas yang tujuannya
buat di-share ke banyak project. Misalnya, rand crate yang kita pake di
Bab 2 nyediain fungsionalitas buat nge-generate angka random. Kebanyakan
waktu pas Rustacean bilang “crate,” maksudnya adalah library crate, dan mereka
pake kata “crate” secara bergantian sama konsep pemrograman umum dari sebuah
“library” (perpustakaan).
Crate root adalah file sumber (source file) tempat compiler Rust mulai dan ngebentuk modul root (akar) dari crate kita (kita bakal jelasin modul secara mendalam di “Mendefinisikan Modul untuk Mengontrol Scope dan Privasi”).
Sebuah package adalah bundel dari satu atau lebih crates yang nyediain sekumpulan fungsionalitas. Sebuah package punya file Cargo.toml yang ngejelasin gimana cara nge-build crates itu. Cargo sebenernya adalah sebuah package yang isinya binary crate buat tool command line yang selama ini kita pake buat nge-build kode kita. Package Cargo juga punya sebuah library crate yang bergantung pada binary crate-nya. Project lain bisa bergantung pada library crate Cargo buat pake logika yang sama kayak yang dipake sama tool command line Cargo.
Sebuah package bisa isinya sebanyak apa pun binary crates yang kita mau, tapi maksimal cuma boleh punya satu library crate. Sebuah package minimal harus punya satu crate, entah itu library crate atau binary crate.
Yuk kita telusuri apa yang terjadi pas kita bikin sebuah package. Pertama kita
jalanin perintah 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
Setelah kita jalanin cargo new my-project, kita pake ls buat liat apa yang
dibuat sama Cargo. Di direktori project-nya, ada file Cargo.toml, yang ngasih
kita sebuah package. Ada juga direktori src yang isinya main.rs. Buka file
Cargo.toml di text editor kita, dan perhatiin kalau nggak ada sebutan soal
src/main.rs. Cargo ngikutin konvensi kalau src/main.rs itu adalah crate root
dari sebuah binary crate dengan nama yang sama kayak package-nya. Sama juga,
Cargo tau kalau direktori package-nya punya src/lib.rs, berarti package itu
punya library crate dengan nama yang sama kayak package-nya, dan src/lib.rs
itu adalah crate root-nya. Cargo bakal ngasih file crate root ini ke rustc
buat nge-build library atau binary-nya.
Di sini, kita punya package yang isinya cuma src/main.rs, artinya dia cuma
punya sebuah binary crate namanya my-project. Kalau sebuah package punya
src/main.rs sama src/lib.rs, dia punya dua crates: sebuah binary dan
sebuah library, yang keduanya punya nama yang sama kayak package-nya. Sebuah
package bisa punya banyak binary crates dengan naruh file-file-nya di direktori
src/bin: tiap file bakal jadi binary crate yang terpisah.