web-dev-qa-db-ja.com

バイナリのみの依存関係を指定するにはどうすればよいですか?

バイナリとライブラリの両方を備えたクレートがあります。ライブラリは依存関係を非常に軽くしていますが、バイナリはファイルのロードやスコープ付きの並列処理などにかなり多くのことを必要とします。

現在、Cargo.tomlを次のように設定しています。

[dependencies.kdtree]
path = "../kdtree"

[dependencies]
Rand="0.3.0"
rustc-serialize = "0.3"
csv = {git = "https://github.com/BurntSushi/Rust-csv.git"}
crossbeam = "0.2"
num_cpus = "0.2"

[lib]
name = "conformal"
path = "src/lib.rs"

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

ライブラリに必要な依存関係は、kdtreeRandだけです。ただし、ライブラリをビルドするだけでも、とにかくバイナリのみの依存関係を構築するようです。 features[[bin].dependencies][ucitest-dependencies]のような他のトリックを使ってみました(またはdependencies= []の下に[[bin]]行を追加しました)。バイナリ用にビルドしますが、方法が見つかりません。

これらはこれを問題にするのに十分な依存関係ではありませんが、それは私を悩ませています。特定のバイナリ用にのみビルドされるように依存関係を絞り込む方法はありますか?

27
LinearZoetrope

必要なものをシミュレートする方法はいくつかあります。


1)バイナリを例に変える

テストはdev-dependenciesで構築されているため、これらの依存関係をこのセクションに移動できます。ライブラリはそれらに依存しません。

# File structure
conformal/
    Cargo.toml
    src/
        lib.rs
    examples/        # <-- the `ucitest` is
        ucitest.rs   # <-- moved to here
# Cargo.toml

[dependencies]
kdtree = { path = "../kdtree" }
Rand = "0.3"

[dev-dependencies]  # <-- move the examples-only dependencies here
serde = "1"
csv = "0.15"
crossbeam = "0.3"
num_cpus = "1"

[lib]
name = "conformal"

[[example]]         # <--- declare the executable
name = "ucitest"    # <--- as an example

バイナリを実行するには、次を使用します。

cargo run --example ucitest

2)必要な機能を備えたオプションの依存関係

依存関係を作成することができます オプション ので、conformalライブラリに依存する他のクレートはそれらをダウンロードする必要はありません。

Rust 1.17から、バイナリはそれらを宣言できます 必須 特定のオプション機能をオンにして、これらのライブラリを事実上「バイナリにのみ必要」にします。

# Cargo.toml

[dependencies]
kdtree = { path = "../kdtree" }
Rand = "0.3"

serde = { version = "1", optional = true }          # <-- make 
csv = { version = "0.15", optional = true }         # <-- all of
crossbeam = { version = "0.3", optional = true }    # <-- them
num_cpus = { version = "1", optional = true }       # <-- optional

[lib]
name = "conformal"

[features]
build-binary = ["serde", "csv", "crossbeam", "num_cpus"]

[[bin]]         
name = "ucitest"    
required-features = ["build-binary"]     # <--

バイナリをビルドするときは、手動で--features build-binaryを渡す必要があることに注意してください。

cargo run --features build-binary --bin ucitest

3)バイナリを独自のパッケージとして作成する

ライブラリとバイナリが別々のパッケージである場合は、好きな依存関係管理を行うことができます。

# File structure
conformal/
    Cargo.toml
    src/
        lib.rs
    ucitest/          # <-- move ucitest
        Cargo.toml    # <-- into its own
        src/          # <-- package.
            main.rs 
# ucitest/Cargo.toml 

[dependencies]
conformal = { version = "0.1", path = "../" }   # <-- explicitly depend on the library
serde = "1"
csv = "0.15"
crossbeam = "0.3"
num_cpus = "1"
18
kennytm
5
kriomant

最近では、これはおそらくワークスペース[ 12 ]で最もよく解決されます。

ディレクトリ構造は次のとおりです。

project-root
├── Cargo.lock
├── Cargo.toml
├── yourlibary
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── src
│   └── main.rs
└── target

トップレベルのCargo.tomlファイル:

[package]
name = "yourprogram"
version = "0.1.0"
authors = ["You <[email protected]>"]

[workspace]

[dependencies]
yourlibrary = { path = "yourlibrary" }

yourlibraryCargo.tomlファイル:

[package]
name = "yourlibrary"
version = "0.1.0"
authors = ["You <[email protected]>"]

[dependencies]

Cargo.lockファイルとtargetディレクトリはプロジェクトのルートディレクトリにあり、ワークスペース内のすべてのコンポーネントで共有されます。ワークスペースコンポーネントは、locakパスの依存関係から自動的に推測されますが、手動で指定することもできます。

Cargo.tomlファイルを含む各コンポーネントは、引き続きcrates.ioで個別に公開できます。

5
kralyk