[rust] Cargo로 여러 바이너리를 어떻게 만들 수 있습니까?

유닉스 소켓을 통해 연결 하는 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

두 가지 문제를 모두 관리하는 하나의 실행 파일을 만들 수는 있지만 아주 좋은 습관이 아니라면 내가하고 싶은 일이 아닙니다.



답변

여기에[[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되고 clientCargo가 모든 파일을 src/bin같은 이름의 실행 파일로 자동으로 컴파일합니다 . 이 규칙을 따르지 않는 경우에만 위의 스 니펫에서와 같이 이름과 경로를 지정해야합니다.


답변

또 다른 방법은 작업 공간 기능 을 사용 하는 것 입니다. 이것은 우리가 둘 이상의 라이브러리를 가질 수 있기 때문에 더 많은 유연성을 제공 할 것입니다. 프로젝트 구조의 예 :

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


답변

또 다른 형식은 다음과 같이 대규모 프로젝트가있는 경우 Crates.io 소스 코드 가 수행 한 작업 을 복제하는 것입니다.

실행 파일이있는 Bin 폴더가있는 src의 메인 라이브러리. 그런 다음 실행 파일에서 기본 라이브러리 상자를 호출합니다.

이렇게하면 라이브러리가 중앙 집중화되어 캐시 된 항목을 쉽게 찾을 수 있습니다.


답변