ฉันจะสร้างไบนารีหลายรายการด้วย Cargo ได้อย่างไร


106

ฉันต้องการสร้างโปรเจ็กต์ที่มี a daemonและ a clientโดยเชื่อมต่อผ่านซ็อกเก็ตยูนิกซ์

A clientและ a daemonต้องใช้สองไบนารีดังนั้นฉันCargoจะบอกได้อย่างไรว่าจะสร้างสองเป้าหมายจากแหล่งที่มาที่แตกต่างกันสองแหล่ง

เพื่อเพิ่มความเป็นแฟนตาซีฉันอยากจะมีlibraryส่วนหลักของdaemonมันและแค่มีไบนารีเพื่อพันรอบมันและสื่อสารผ่านซ็อกเก็ต

ดังนั้นเราจึงมีสถาปัตยกรรมต้นไม้ประเภทนี้:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

ฉันสามารถสร้างไฟล์ปฏิบัติการซึ่งจัดการข้อกังวลทั้งสองได้ แต่นั่นไม่ใช่สิ่งที่ฉันต้องการทำเว้นแต่จะเป็นแนวทางปฏิบัติที่ดีมาก



เพื่อเสริมคำตอบของ Dognertพวกเขาตอบคำถามทั้งหมดที่ฉันได้รับ ขอบคุณมาก!
RallionRl

คำตอบ:


138

คุณสามารถระบุไบนารีหลายรายการโดยใช้[[bin]]ดังที่กล่าวไว้ที่นี่ :

[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]
name = "client"
path = "src/client/bin/main.rs"

เคล็ดลับ: หากคุณใส่ไฟล์เหล่านี้เข้าไปแทนsrc/bin/daemon.rsและsrc/bin/client.rsคุณจะได้รับไฟล์ปฏิบัติการสองชื่อdaemonและclientเนื่องจาก Cargo รวบรวมไฟล์ทั้งหมดในไฟล์src/binปฏิบัติการที่มีชื่อเดียวกันโดยอัตโนมัติ คุณต้องระบุชื่อและเส้นทางเหมือนในตัวอย่างข้อมูลด้านบนเฉพาะในกรณีที่คุณไม่ปฏิบัติตามหลักการนี้


ฉันได้ดูเอกสาร Cargo แล้ว แต่ไม่เห็นอะไรเลยคุณสามารถระบุผลลัพธ์เพื่อจัดเก็บไบนารีได้หรือไม่? เช่น pathTo: "/ some / path" ฉันขอโทษสำหรับภาษาอังกฤษของฉัน
Angel Angel

ถ้าคุณคิดว่าจะดีกว่าที่จะสร้างคำถามเกี่ยวกับเรื่องนี้ฉันสามารถทำได้โดยไม่มีปัญหาใด ๆ มันอาจจะง่ายกว่าที่จะหาคนอื่นที่มีคำถามเดียวกัน?
Angel Angel

@AngelAngel คุณต้องการปรับแต่งเส้นทางเอาต์พุตหรือไม่? โดยค่าเริ่มต้นมันจะถูกเก็บไว้ในtarget/debug/$nameสถานที่ที่$nameเป็นnameคุณระบุใน Cargo.toml
Dogbert

ฉันแค่สงสัยว่าคุณสามารถบอกได้ว่าจะติดตั้งสำเนาของไบนารีไว้ที่ใดนอกเหนือจากค่าเริ่มต้นได้หรือไม่ สำเนาใน $ name และอีกสำเนาในเส้นทางอื่น ไม่ใช่ว่าเป็นเรื่องเล็กน้อยเพียงแค่อยากรู้ขอบคุณที่สละเวลา
Angel Angel

@AngelAngel ฉันคิดว่าคุณกำลังมองหาcargo installคำสั่ง ลองอ่านผลลัพธ์ของcargo help install.
Dogbert

18

อีกวิธีหนึ่งคือการใช้คุณลักษณะพื้นที่ทำงาน สิ่งนี้จะให้ความยืดหยุ่นมากขึ้นเนื่องจากเราสามารถมีห้องสมุดได้มากกว่าหนึ่งไลบรารี ตัวอย่างโครงสร้างโครงการ:

.
├── Cargo.toml
├── cli
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── core
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── daemon
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── gui
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── rpc
    ├── Cargo.toml
    └── src
        └── lib.rs

เนื้อหาของรากCargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]

1
ฉันไม่สามารถทำงานนี้ได้ ฉันต้องย้ายแหล่งสนิมไบนารีในโฟลเดอร์ src / และระบุเป้าหมายอื่นใน[[bin]]. คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่คุณทำเพื่อให้ได้ผลหรือไม่? ฉันได้รับข้อผิดพลาดต่อไปนี้: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge

@KennyBambridge ฉันไม่ได้ทำงานกับ Rust มาระยะหนึ่งแล้ว IIRC เมื่อฉันสร้างคำตอบนี้ฉันได้ลองใช้กับเครื่องในพื้นที่ของฉันและทำงานได้ตามที่ตั้งใจ
UltimaWeapon

@KennyBambridge คุณต้องเพิ่มลังในพื้นที่ทำงานอื่นเป็นการอ้างอิงใน Cargo.toml ที่คุณต้องการใช้
Caesar

1

อีกรูปแบบหนึ่งอาจเป็นการจำลองสิ่งที่ซอร์สโค้ด Crates.ioได้ทำหากคุณมีโปรเจ็กต์ขนาดใหญ่เช่น:

ไลบรารีหลักใน src พร้อมโฟลเดอร์ Bin พร้อมไฟล์ปฏิบัติการของคุณ จากนั้นโทรไปยังคลังหลักของคุณจากไฟล์ปฏิบัติการของคุณ

ด้วยวิธีนี้ห้องสมุดของคุณจะรวมศูนย์เพื่อให้ค้นหาสิ่งต่างๆได้ง่ายขึ้นเมื่อแคช

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.