Skip to content

Learning Rust #2 | ใช้ cargo run แบบ multiple targets

ถ้าเราสร้างโปรเจกต์ด้วยคำสั่ง 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 โครงสร้างของโปรเจกต์จะเป็นแบบนี้

Selection_104

เสร็จแล้วก็แก้ไขไฟล์ 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 เพียงอันเดียวเท่านั้น

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.