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

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.