ถ้าเราสร้างโปรเจกต์ด้วยคำสั่ง cargo new my-project –bin โปรเจกต์นั้นจะสามารถรัน target ได้แค่ target เดียวซึ่งก็คือโปรแกรมที่เขียนไว้ในไฟล์ src/main.rs แล้วถ้าเกิดว่าเราอยากรันหลายๆ target ล่ะ ทำยังไง?
จริงอยู่ที่แต่ละโปรเจกต์ควรทำหน้าที่เพียงอย่างเดียว มี main function เดียว แต่ถ้ากรณีที่เราต้องการทดลองโปรแกรมหลายๆ แบบซึ่งไม่มีความเกี่ยวข้องกันเลยในโปรเจกต์เดียวกันล่ะ? กรณีไหนบ้างที่ต้องทำแบบนี้? กรณีที่ชัดเจนที่สุดก็ตอนเริ่มเรียนรู้จากจาก example code ต่างๆ นี่ไงครับ
เข้าใจ Cargo.toml กันก่อน
ก่อนอื่นเราต้องเข้าใจ config ของ Cargo ก่อน ผมแนะนำให้อ่าน doc นี้ครับ
http://doc.crates.io/manifest.html
สิ่งที่เราต้องสนใจคือหัวข้อ The Project layout ซึ่งจะบอกว่าแต่ละไดเรกทอรีหรือไฟล์มีไว้ทำอะไรบ้าง
Config ไฟล์ Cargo.toml
โจทย์ของผมคือต้องการรันหลายๆ main.rs ซึ่งอยู่ในไดเรกทอรีซึ่งอยู่ใต้ src/ อีกทีโดยแยกเป็นหลายๆ ไดเรกทอรีตามแต่ละเรื่องที่เราศึกษา (target) โดยเราสามารถ build โปรเจกต์และสั่งรันแต่ละ target ตามชื่อ target ได้
สมมุติว่าผมมี 2 targets คือ guessing-game และ loop โครงสร้างของโปรเจกต์จะเป็นแบบนี้
เสร็จแล้วก็แก้ไขไฟล์ Cargo.toml แล้วเพิ่มรายละเอียดของ [[bin]] เข้าไป โดยระบุ name และ path ของ main.rs ตามนี้
[package] name = "learn-rust-lang" version = "0.1.0" authors = ["Korkeat W. <khasathan@gmail.com>"] [dependencies] rand = "0.3.0" [[bin]] name = "guessing-game" path = "src/guessing-game/main.rs" [[bin]] name = "loop" path = "src/loop/main.rs"
สั่ง build และรันแต่ละ target
$cd my-project/ # build ทั้งหมด $cargo build # รัน target แรก $cargo run --bin loop # รัน target ที่สอง $cargo run --bin guessing-game
คำสั่งข้างบนจะเห็นว่าผมใส่ –bin เสมอ ถ้าไม่ใส่จะพบ error แบบนี้
`cargo run` requires that a project only have one executable; use the `--bin` option to specify which one to run
เนื่องจาก cargo อนุญาตให้มี executatble file เพียงอันเดียวเท่านั้น