Package และ Crate
ส่วนแรกของระบบ module ที่เราจะครอบคลุมคือ package และ crate
crate คือจำนวนน้อยที่สุดของโค้ดที่ Rust compiler พิจารณาในเวลาหนึ่ง
แม้ว่าคุณรัน rustc แทน cargo และส่งไฟล์ source code เดียว (อย่างที่เรา
ทำเมื่อนานมาแล้วใน “พื้นฐานโปรแกรม Rust” ในบทที่
- compiler ถือว่าไฟล์นั้นเป็น crate Crate มี module ได้ และ module ประกาศในไฟล์อื่นที่ compile กับ crate ได้ อย่างที่เราจะเห็นในส่วนถัด ๆ ไป
Crate เป็นได้ในสองรูปแบบ — binary crate หรือ library crate Binary crate
คือโปรแกรมที่คุณ compile เป็น executable ที่คุณรันได้ เช่น โปรแกรม
command line หรือ server แต่ละตัวต้องมีฟังก์ชันชื่อ main ที่ประกาศว่า
เกิดอะไรขึ้นเมื่อ executable รัน Crate ทั้งหมดที่เราสร้างที่ผ่านมาเป็น
binary crate
Library crate ไม่มีฟังก์ชัน main และไม่ compile เป็น executable แทน
นั้น พวกมันประกาศ functionality ที่ตั้งใจให้แชร์กับหลายโปรเจกต์ เช่น
crate rand ที่เราใช้ใน บทที่ 2 มี functionality
ที่ generate ตัวเลขสุ่ม โดยส่วนใหญ่เมื่อ Rustacean พูดว่า “crate” พวกเขา
หมายถึง library crate และใช้ “crate” แทน concept “library” ทั่วไปในการ
เขียนโปรแกรม
crate root คือไฟล์ source ที่ Rust compiler เริ่มจาก และประกอบเป็น module root ของ crate ของคุณ (เราจะอธิบาย module อย่างละเอียดใน “ควบคุม Scope และ Privacy ด้วย Module”)
package คือ bundle ของ crate หนึ่งหรือมากกว่าที่ให้ชุดของ functionality package มีไฟล์ Cargo.toml ที่บรรยายวิธี build crate เหล่านั้น Cargo จริง ๆ เป็น package ที่มี binary crate สำหรับเครื่องมือ command line ที่คุณ ใช้ build โค้ดของคุณ Package Cargo ยังมี library crate ที่ binary crate พึ่งพา โปรเจกต์อื่นพึ่ง library crate ของ Cargo เพื่อใช้ logic เดียวกับ เครื่องมือ command line ของ Cargo ได้
Package มี binary crate ได้เท่าที่คุณอยาก แต่ library crate มากที่สุด หนึ่งตัว Package ต้องมีอย่างน้อยหนึ่ง crate ไม่ว่าจะเป็น library หรือ binary crate
มาเดินผ่านสิ่งที่เกิดเมื่อเราสร้าง package ก่อน เราป้อนคำสั่ง
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
หลังเรา run cargo new my-project เราใช้ ls เพื่อดูสิ่งที่ Cargo สร้าง
ใน directory my-project มีไฟล์ Cargo.toml ให้ package กับเรา ยังมี
directory src ที่มี main.rs เปิด Cargo.toml ใน text editor และ
หมายเหตุว่าไม่มีการเอ่ยถึง src/main.rs Cargo ตาม convention ที่
src/main.rs เป็น crate root ของ binary crate ที่มีชื่อเหมือนกับ
package ในทำนองเดียวกัน Cargo รู้ว่าถ้า directory package มี
src/lib.rs, package มี library crate ที่ชื่อเหมือนกับ package และ
src/lib.rs คือ crate root ของมัน Cargo ส่งไฟล์ crate root ให้ rustc
เพื่อ build library หรือ binary
ที่นี่ เรามี package ที่มีแค่ src/main.rs หมายความว่ามันมีแค่ binary
crate ชื่อ my-project ถ้า package มี src/main.rs และ src/lib.rs
มันมีสอง crate — binary และ library ทั้งคู่ชื่อเหมือนกับ package
Package มี binary crate หลายตัวได้โดยวางไฟล์ใน directory src/bin —
แต่ละไฟล์จะเป็น binary crate แยก