Làm cách nào để tạo nhiều tệp nhị phân với Cargo?


95

Tôi muốn tạo một dự án với a daemonvà a client, kết nối thông qua một ổ cắm unix.

A clientvà a daemonyêu cầu hai tệp nhị phân, vậy làm cách nào để biết Cargocách tạo hai mục tiêu từ hai nguồn khác nhau?

Để thêm một chút giả tưởng, tôi muốn có một mã librarycho phần chính của daemon, và chỉ cần có một mã nhị phân để quấn quanh nó và giao tiếp qua các ổ cắm.

Vì vậy, chúng tôi có loại kiến ​​trúc cây:

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

Tôi có thể làm cho một tệp thực thi được để quản lý cả hai mối quan tâm, nhưng đó không phải là điều tôi muốn làm, trừ khi đó là cách thực hành rất tốt.



Để bổ sung cho câu trả lời của Dognert , họ trả lời tất cả các câu hỏi mà tôi nhận được. Cảm ơn bạn rất nhiều!
RallionRl

Câu trả lời:


126

Bạn có thể chỉ định nhiều tệp nhị phân bằng cách sử dụng [[bin]], như được đề cập ở đây :

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

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

Mẹo: Nếu bạn thay vì đặt các tập tin trong src/bin/daemon.rssrc/bin/client.rs, bạn sẽ nhận được hai thực thi đặt tên daemonclientnhư Cargo biên dịch tất cả các file trong src/binvào thực thi có cùng tên tự động. Bạn chỉ cần chỉ định tên và đường dẫn như trong đoạn mã trên nếu bạn không tuân theo quy ước này.


Tôi đã xem tài liệu Cargo, nhưng tôi không thể nhìn thấy bất cứ điều gì, bạn có thể chỉ định đầu ra để lưu trữ nhị phân? ví dụ pathTo: "/ some / path" Tôi xin lỗi vì tiếng Anh của tôi.
Thiên thần Angel

nếu bạn nghĩ tốt hơn nên tạo một câu hỏi về điều này, tôi có thể làm điều đó mà không gặp vấn đề gì, có thể dễ dàng hơn để tìm những người khác có cùng câu hỏi?
Thiên thần Angel

@AngelAngel bạn muốn tùy chỉnh đường dẫn đầu ra? Theo mặc định nó sẽ được lưu trữ trong target/debug/$namenơi $namenamebạn chỉ định trong Cargo.toml.
Dogbert

Tôi chỉ tự hỏi nếu bạn có thể nói nơi cài đặt bản sao nhị phân ở nơi khác ngoài mặc định. Một bản sao trong $ name và một bản sao khác trong một đường dẫn khác. Không phải là nó là tầm thường, chỉ là tò mò, cảm ơn thời gian của bạn.
Thiên thần Angel

@AngelAngel Tôi nghĩ bạn đang tìm kiếm cargo installlệnh. Hãy thử đọc đầu ra của cargo help install.
Dogbert

14

Một cách khác là sử dụng tính năng không gian làm việc . Điều này sẽ cung cấp tính linh hoạt hơn do thực tế là chúng ta có thể có nhiều hơn một thư viện. Cấu trúc dự án mẫu:

.
├── 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

Nội dung của thư mục gốc Cargo.toml:

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

1
Tôi không thể làm cho nó hoạt động. Tôi đã phải di chuyển nguồn gỉ nhị phân trong thư mục src / và chỉ định một mục tiêu khác trong [[bin]]. Bạn có thể cho biết thêm chi tiết về những gì bạn đã làm để điều này hoạt động? Tôi gặp lỗi sau: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge

@KennyBambridge Tôi đã không làm việc trên Rust trong một thời gian. IIRC khi tôi tạo câu trả lời này, tôi đã thử trên máy cục bộ của mình và nó hoạt động như dự định.
UltimaWeapon

@KennyBambridge Bạn phải thêm thùng trong các không gian làm việc khác dưới dạng phụ thuộc trong Cargo.toml nơi bạn muốn sử dụng chúng.
Caesar

1

Một định dạng khác có thể là sao chép những gì mã nguồn Crates.io đã thực hiện, nếu bạn có một dự án lớn, chẳng hạn như:

Thư viện chính trong src, với một thư mục Bin với các tệp thực thi của bạn. Sau đó, thực hiện các cuộc gọi đến thùng thư viện chính của bạn từ các tệp thực thi của bạn.

Bằng cách đó, thư viện của bạn được tập trung để dễ dàng tìm thấy mọi thứ hơn khi nó được lưu trong bộ nhớ cache.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.