Cargo ile nasıl birden fazla ikili dosya oluşturabilirim?


94

A daemonve a clientile bir unix soketi üzerinden bağlanan bir proje yapmak istiyorum .

A clientve a daemoniki ikili program gerektirir, peki Cargoiki farklı kaynaktan iki hedef oluşturmayı nasıl anlarım ?

Biraz fantezi eklemek libraryiçin, ana bölüm için bir tane istiyorum daemonve sadece onu sarmak ve soketler aracılığıyla iletişim kurmak için bir ikili programa sahip olmak istiyorum.

Yani, bu tür bir ağaç mimarisine sahibiz:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

Her iki endişeyi de yöneten bir yürütülebilir dosya yapabilirim, ancak çok iyi bir uygulama olmadığı sürece yapmak istediğim bu değil.



Komplementinden olarak Dognert en cevabı, onlar bende tüm sorulara cevap. Çok teşekkür ederim!
RallionRl

Yanıtlar:


125

Burada[[bin]] belirtildiği gibi kullanarak birden fazla ikili dosya belirtebilirsiniz :

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

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

İpucu: Bunun yerine bu dosyaları koyarsanız src/bin/daemon.rsve src/bin/client.rs, adlı iki yürütülebilir alırsınız daemonve clientKargo olarak tüm dosyaları derler src/binotomatik olarak aynı isimde yürütülebilir içine. Yalnızca bu kurala uymazsanız yukarıdaki kod parçacığında olduğu gibi adlar ve yollar belirtmeniz gerekir.


Kargo belgelerine baktım ama hiçbir şey göremiyorum, çıktısını ikili depolamak için belirtebilirsiniz? örneğin pathTo: "/ bir / yol" İngilizcem için üzgünüm.
Angel Angel

bununla ilgili bir soru oluşturmanın daha iyi olduğunu düşünüyorsanız, sorunsuz yapabilirim, aynı soruyla başkalarını bulmak daha kolay olabilir mi?
Angel Angel

@AngelAngel çıktı yolunu özelleştirmek mi istiyorsunuz? Varsayılan olarak saklanan olacak target/debug/$namenerede $nameolduğunu namesize Cargo.toml içinde belirtin.
Dogbert

İkili dosyanın bir kopyasını varsayılandan başka bir yere nereye yükleyeceğinizi söyleyebilir misiniz diye merak ettim. $ Name içinde bir kopya ve başka bir yolda başka bir kopya. Önemsiz değil, sadece merak, zaman ayırdığınız için teşekkürler.
Angel Angel

@AngelAngel Bence cargo installkomutu arıyorsunuz . Çıktısını okumayı deneyin cargo help install.
Dogbert

14

Başka bir yol da çalışma alanı özelliğini kullanmaktır . Bu, birden fazla kitaplığa sahip olabilmemiz nedeniyle daha fazla esneklik sağlayacaktır. Örnek proje yapısı:

.
├── 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

Kökün içeriği Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]

1
Bunu işe alamadım. İkili pas kaynağını src / klasörüne taşımak ve içinde başka bir hedef belirtmek zorunda kaldım [[bin]]. Bunun işe yaraması için ne yaptığınız hakkında daha fazla ayrıntı verebilir misiniz? Şu hatayı use ::engine::RuleEngine; could not find engine in {{root}}
alıyordum

@KennyBambridge Bir süredir Rust üzerinde çalışmadım. IIRC bu cevabı oluşturduğumda yerel makinemde denedim ve amaçlandığı gibi çalışıyor.
UltimaWeapon

@KennyBambridge Diğer çalışma alanlarındaki kasaları, kullanmak istediğiniz Cargo.toml'de bağımlılıklar olarak eklemeniz gerekir.
Sezar

1

Başka bir format, Crates.io kaynak kodunun yaptığını çoğaltmak olabilir , eğer büyük bir projeniz varsa, şöyle bir şey:

Çalıştırılabilir dosyalarınızın bulunduğu Bin klasörü ile src'deki Ana Kitaplık. Ardından çalıştırılabilir dosyalarınızdan ana kitaplık kasanıza çağrı yapın.

Bu şekilde, kitaplığınız merkezileştirilir, önbelleğe alınan şeyleri bulmak daha kolaydır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.