2014-11-15 4 views
49

मैं एक जंग पैकेज बनाना चाहता हूं जिसमें एक पुन: प्रयोज्य लाइब्रेरी (जहां अधिकांश कार्यक्रम लागू किया गया हो), और यह भी निष्पादन योग्य है जो इसका उपयोग करता है।एक लाइब्रेरी और बाइनरी दोनों के साथ जंग पैकेज?

मान लीजिए कि मैंने जंग मॉड्यूल सिस्टम में किसी भी अर्थशास्त्र को भ्रमित नहीं किया है, तो मेरी Cargo.toml फ़ाइल को किस तरह दिखाना चाहिए?

उत्तर

65

टोक: tmp डौग $ डु -एक

8 ./Cargo.toml 
8 ./src/bin.rs 
8 ./src/lib.rs 
16 ./src 

Cargo.toml:

[package] 
name = "mything" 
version = "0.0.1" 
authors = ["me <[email protected]>"] 

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

use mylib::test; 

pub fn main() { 
    test(); 
} 
+1

धन्यवाद डौग, मैं यह कोशिश करेंगे! क्या #! [Crate_name =] और #! [Crate_type] एनोटेशन वैकल्पिक हैं? –

+4

जब आप कार्गो का उपयोग करते हैं, तो ये विकल्प अनावश्यक होते हैं क्योंकि कार्गो उन्हें कंपाइलर झंडे के रूप में पास करता है। यदि आप 'कार्गो बिल्ड --verbose' चलाते हैं, तो आप उन्हें' rustc' कमांड लाइन में देखेंगे। –

+11

क्या आपको पता है क्यों '[[bin]]' टेबल की सरणी है? '[[Bin]]' का उपयोग क्यों करें और '[bin]' क्यों नहीं? इस पर कोई प्रलेखन प्रतीत नहीं होता है। – CMCDragonkai

53

आप src/bin और अपने शेष स्रोतों को src में बाइनरी स्रोत भी डाल सकते हैं। आप my project में एक उदाहरण देख सकते हैं। आपको अपने Cargo.toml को बिल्कुल संशोधित करने की आवश्यकता नहीं है, और प्रत्येक स्रोत फ़ाइल को उसी नाम की बाइनरी में संकलित किया जाएगा।

अन्य जवाब के विन्यास तब तक बदल जाएगी:

$ tree 
. 
├── Cargo.toml 
└── src 
   ├── bin 
   │   └── mybin.rs 
   └── lib.rs 

$ cat Cargo.toml 
[package] 
name = "example" 
version = "0.0.1" 
authors = ["An Devloper <[email protected]>"] 

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

+7

जंग के सम्मेलन-ओवर-कॉन्फ़िगरेशन दृष्टिकोण के साथ अच्छी तरह से फिट बैठता है! दोनों एक साथ जवाब देते हैं और आपके पास कुछ शानदार सुविधा और लचीलापन है। –

+0

@ शेमपस्टर जब मैं 'src/bin' में अतिरिक्त बाइनरी जोड़ता हूं, तब जब मैं उन्हें 'कार्गो रन --बिन mybin' के साथ चलाता हूं तो 'mybin' निष्पादन योग्य की एक अतिरिक्त प्रति रूट प्रोजेक्ट निर्देशिका में उत्पन्न होती है। इसे रोकने के तरीके पर कोई विचार? – Nathan

+0

@ नाथन जंग के साथ इस उत्तर में चरणों का पालन करते हुए 1.15.1, मैं आपके द्वारा वर्णित व्यवहार को पुन: उत्पन्न करने में सक्षम नहीं हूं। – Shepmaster

9

लक्ष्य अंकन आप सूत्रों के lib.rs और main.rs डाल सकता है फ़ोल्डर पर विचार करें। कोई संघर्ष नहीं है और कार्गो दोनों चीजों का निर्माण करेगा।

documentaion संघर्ष अपने Cargo.toml में जोड़ने के लिए हल करने के लिए:

[[bin]] 
name = "main" 
doc = false 
+1

"" इसके अतिरिक्त, आप केवल एक src/main.rs बना सकते हैं जिसे डिफैक्टो निष्पादन योग्य * के रूप में उपयोग किया जाएगा। दूसरे जवाब में, नहीं? और प्रलेखन संघर्ष स्वीकृत उत्तर द्वारा हल किया गया है, है ना? आपको यह दिखाने के लिए अपने उत्तर को स्पष्ट करने की आवश्यकता हो सकती है कि यह अद्वितीय क्यों है। उन पर निर्माण के अन्य उत्तरों का संदर्भ देना ठीक है। – Shepmaster

संबंधित मुद्दे