Vraag Geef binaire afhankelijkheden op


Ik heb een kist met zowel een binaire als een bibliotheek. De library is extreem licht op afhankelijkheden, terwijl het binary nogal wat meer nodig heeft om bijvoorbeeld bestanden te laden of parallelle dingen te scopeden.

Momenteel heb ik mijn Cargo.toml als volgt opgezet:

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

De enige afhankelijkheden die de bibliotheek nodig heeft, zijn de kdtree en rand. Het lijkt er echter op dat, zelfs als je alleen de bibliotheek bouwt, het de binaire afhankelijkheden sowieso bouwt. Ik heb geprobeerd het te gebruiken features en andere trucs zoals [[bin].dependencies] of [ucitest-dependencies] (of een toevoegen dependencies= [] regel onder [[bin]]) waarvan ik dacht dat ze alleen voor het binaire bestand zouden kunnen bouwen, maar ik kan geen manier vinden.

Dit zijn niet genoeg afhankelijkheden om dit een probleem te maken, maar het hindert me. Is er een manier om afhankelijkheden te beperken zodat ze alleen voor specifieke binaire bestanden kunnen bouwen?


13
2018-02-29 22:31


oorsprong


antwoorden:


Er zijn verschillende manieren om te simuleren wat je wilt:


1) Verander de binaire bestanden in voorbeelden

Voorbeelden en tests worden gebouwd met dev-dependencies, zodat u die afhankelijkheden in deze sectie kunt verplaatsen. De bibliotheek is niet afhankelijk van hen.

# 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

Gebruik het binaire bestand om:

cargo run --example ucitest

2) Optionele afhankelijkheden met vereiste functies

Afhankelijkheden kunnen worden gemaakt facultatief, dus andere kratten die afhankelijk zijn van jouw conformal bibliotheek hoeft ze niet te downloaden.

Uitgaande van Rust 1.17 kunnen binaries ze verklaren vereisen bepaalde optionele functies worden ingeschakeld, waardoor die bibliotheken "alleen nodig zijn voor binaire bestanden".

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

Merk op dat je handmatig moet passen --features build-binary bij het bouwen van de binaries:

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

3) Maak de binaire bestanden als een eigen pakket

U kunt doen wat afhankelijkheidsbeheer u wilt wanneer de bibliotheek en het binaire bestand afzonderlijke pakketten zijn.

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

9
2017-09-02 19:10



Dit is nog niet geïmplementeerd in Cargo.


3
2018-03-14 10:22



Tegenwoordig is dit waarschijnlijk het beste opgelost met werkruimten [1, 2].

De directory-structuur is als volgt:

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

Het hoogste niveau Cargo.toml het dossier:

[package]
name = "yourprogram"
version = "0.1.0"
authors = ["You <you@example.com>"]

[workspace]

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

yourlibrary  Cargo.toml het dossier:

[package]
name = "yourlibrary"
version = "0.1.0"
authors = ["You <you@example.com>"]

[dependencies]

De Cargo.lock bestand evenals de target map bevindt zich in de hoofdmap van het project en wordt gedeeld door alle componenten in de werkruimte. Werkruimtecomponenten worden automatisch geconcludeerd van afhankelijkheden met het locak-pad, maar kunnen ook handmatig worden opgegeven.

Elke component met zijn Cargo.toml bestand kan nog steeds afzonderlijk worden gepubliceerd op crates.io


2
2017-11-04 18:00