라이브러리와 바이너리가 모두있는 녹 패키지?
가능한 가능한 라이브러리 (대부분의 프로그램이 구현되는 곳)와 그것을 사용하는 실행 파일이 모두 들어있는 Rust 패키지를 만들고 싶습니다.
Rust 모듈 시스템에서 시맨틱을 혼동하지 않았다고 가정하면 Cargo.toml
파일은 어떻게 생겼습니까?
Tok:tmp doug$ du -a
8 ./Cargo.toml
8 ./src/bin.rs
8 ./src/lib.rs
16 ./src
Cargo.toml :
[package]
name = "mything"
version = "0.0.1"
authors = ["me <me@gmail.com>"]
[lib]
name = "mylib"
path = "src/lib.rs"
[[bin]]
name = "mybin"
path = "src/bin.rs"
src / lib.rs :
pub fn test() {
println!("Test");
}
src / bin.rs :
extern crate mylib; // not needed since Rust edition 2018
use mylib::test;
pub fn main() {
test();
}
를 넣고 바이너리 소스 src/bin
나머지 소스는에 넣을 수도 있습니다 src
. 내 프로젝트 에서 예제를 볼 수 있습니다 . 전혀 수정하지 않고 모든 Cargo.toml
소스 파일은 동일한 이름의 파일로 저장됩니다.
그런 다음 다른 답변의 구성은 다음으로 대체됩니다.
$ tree
.
├── Cargo.toml
└── src
├── bin
│ └── mybin.rs
└── lib.rs
Cargo.toml
[package]
name = "example"
version = "0.0.1"
authors = ["An Devloper <an.devloper@example.com>"]
src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
src / bin / mybin.rs
extern crate example;
fn main() {
println!("I'm using the library: {:?}", example::really_complicated_code(1, 2));
}
그리고 그것을 실행하십시오 :
$ cargo run --bin mybin
I'm using the library: Ok(3)
또한 src/main.rs
실제 실행 파일로 사용할 수 있습니다 . 불행히도이 다음 cargo doc
명령 과 충돌합니다 .
라이브러리와 바이너리 이름이 같은 패키지는 문서화 할 수 없습니다. 하나의 이름을 바꾸거나 대상을 다음과 같이 표시하십시오.
doc = false
대체 수단은 실제로 두 가지를 하나의 패키지에 넣지 않는 것입니다. 보다 한 실행 파일이있는 약간의 큰 프로젝트의 경우 작업 공간 을 사용하는 것이 매우 좋습니다.
내부에 라이브러리를 포함하는 바이너리 프로젝트를 만듭니다.
the-binary
├── Cargo.lock
├── Cargo.toml
├── mylibrary
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
└── src
└── main.rs
Cargo.toml
이 키 [workspace]
를 사용하며 라이브러리에 따라 늘어서 있습니다.
[package]
name = "the-binary"
version = "0.1.0"
authors = ["An Devloper <an.devloper@example.com>"]
[workspace]
[dependencies]
mylibrary = { path = "mylibrary" }
src / main.rs
extern crate mylibrary;
fn main() {
println!("I'm using the library: {:?}", mylibrary::really_complicated_code(1, 2));
}
mylibrary / src / lib.rs
use std::error::Error;
pub fn really_complicated_code(a: u8, b: u8) -> Result<u8, Box<Error>> {
Ok(a + b)
}
그리고 그것을 실행하십시오 :
$ cargo run
Compiling mylibrary v0.1.0 (file:///private/tmp/the-binary/mylibrary)
Compiling the-binary v0.1.0 (file:///private/tmp/the-binary)
Finished dev [unoptimized + debuginfo] target(s) in 0.73 secs
Running `target/debug/the-binary`
I'm using the library: Ok(3)
이 계획에는 두 가지 큰 이점이 있습니다.
바이너리는 이제 자신에게만 적용되는 사용할 수 있습니다. 예를 들어 명령 줄 구문 분석기 또는 터미널 형식 지정과 같이 사용자 경험을 개선하기 위해 많은 상자를 포함 할 수 있습니다. 이들 중 어느 것도 라이브러리를 "감염"이라고합니다.
작업 공간은 각 구성 요소의 빌드를 방지합니다. 및 디렉토리
cargo build
에서 모두 실행 하면 라이브러리가 두 번 빌드되지 않고 두 프로젝트간에 공유됩니다.mylibrary
the-binary
당신은 넣을 수 있습니다. lib.rs
와 main.rs
소스가 함께 폴더로 이동합니다. 갈등이없고 화물이 두 가지를 모두 만들 것입니다.
문서 충돌을 해결하기 위해 다음을 추가하십시오 Cargo.toml
.
[[bin]]
name = "main"
doc = false
참고 URL : https://stackoverflow.com/questions/26946646/rust-package-with-both-a-library-and-a-binary
'IT' 카테고리의 다른 글
Visual Studio에서 조건부 중단 점을 설정하는 방법은 무엇입니까? (0) | 2020.07.10 |
---|---|
어디에서 어떻게 YAML 매핑을 OrderedDicts로로드 할 수 있습니까? (0) | 2020.07.10 |
사용중인 Entity Framework 버전을 확인하고? (0) | 2020.07.10 |
html5 비디오 태그에서 소스 변경 (0) | 2020.07.10 |
우분투에서 Java 환경 경로를 설정하는 방법 (0) | 2020.07.10 |