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


94

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

답변:


125

여기에[[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 문서를 살펴 봤지만 아무것도 볼 수 없습니다. 바이너리를 저장할 출력을 지정할 수 있습니까? 예를 들어 pathTo : "/ some / path"영어로 죄송합니다.
Angel Angel

이것에 대한 질문을 만드는 것이 더 좋다고 생각하면 문제없이 할 수 있습니다. 같은 질문을 가진 다른 사람들을 찾는 것이 더 쉬울 수 있습니까?
Angel Angel

@AngelAngel 출력 경로를 사용자 지정 하시겠습니까? 기본적으로이 저장됩니다 target/debug/$name$name은 IS name당신이 Cargo.toml에 지정합니다.
Dogbert 2016-04-14

기본값이 아닌 다른 곳에 바이너리 복사본을 설치할 위치를 말할 수 있는지 궁금했습니다. $ name의 사본과 다른 경로의 다른 사본. 사소한 것이 아니라 호기심이 많습니다. 시간 내 주셔서 감사합니다.
Angel Angel

@AngelAngel 나는 당신이 cargo install명령을 찾고 있다고 생각합니다 . 의 출력을 읽어보십시오 cargo help install.
Dogbert 2016-04-14

14

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

.
├── 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
나는 이것을 작동시킬 수 없었다. 바이너리 rust 소스를 src / 폴더로 옮기고 [[bin]]. 이 작업을 수행하기 위해 수행 한 작업에 대해 자세히 설명해 주시겠습니까? 다음과 같은 오류가 발생했습니다. use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge

@KennyBambridge 나는 한동안 Rust에서 일하지 않았습니다. 이 답변을 만들 때 IIRC는 로컬 컴퓨터에서 시도했으며 의도 한대로 작동합니다.
UltimaWeapon

@KennyBambridge 다른 작업 공간의 상자를 사용하려는 Cargo.toml의 종속성으로 추가해야합니다.
Caesar

1

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.