Как я могу указать бинарные зависимости?

У меня есть ящик с двоичным и библиотечным. Библиотека чрезвычайно полезна для зависимостей, в то время как для двоичного файла требуется немного больше, например, загружать файлы или выполнять параллельные действия.

В настоящее время я создаю свой 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"

Единственными зависимостями, которые необходимы библиотеке, являются kdtree и rand. Тем не менее, похоже, что даже если вы только создаете библиотеку, она все равно будет строить зависимые от двоичного кода. Я пробовал использовать features и другие трюки, например [[bin].dependencies] или [ucitest-dependencies] (или добавить строку dependencies= [] под [[bin]]), которые, как я думал, могут сделать их только для двоичного кода, но я не могу найти путь.

Это недостаточно для зависимостей, чтобы сделать это проблемой, но это беспокоит меня. Есть ли способ сузить зависимости, поэтому они создаются только для определенных двоичных файлов?

Ответ 1

Существует несколько способов моделирования того, что вы хотите:


1) Поверните двоичные файлы к примерам

Examples, а тесты построены с помощью 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, двоичные файлы могут объявлять require некоторые дополнительные функции, которые необходимо включить, что фактически делает эти библиотеки "необходимыми только для двоичные файлы".

# 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"

Ответ 3

В наши дни это, вероятно, лучше всего решать с рабочими пространствами [1, 2].

Структура каталогов выглядит следующим образом:

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" }

yourlibrary Cargo.toml файл:

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

[dependencies]

Файл Cargo.lock, а также каталог target находятся в корневом каталоге проекта и совместно используются всеми компонентами в рабочей области. Компоненты рабочей области выводятся автоматически из зависимостей с помощью пути locak, но также могут быть указаны вручную.

Каждый компонент с его файлом Cargo.toml может быть опубликован отдельно на crates.io