मेरे पास एक जंग परियोजना है जो एक गतिशील (cdylib) पुस्तकालय उत्पन्न करती है। प्रोजेक्ट एक cbindgen बिल्ड स्क्रिप्ट का उपयोग करके एक सी हेडर फ़ाइल बनाने के लिए लाइब्रेरी के निर्यात किए गए कार्यों से मेल खाता है . Cargo.toml ऐसा दिखता है:

[package]
name = "example"
version = "0.1.0"
authors = ["Me <me@foo.bar>"]
build = "build.rs"

[lib]
name = "example"
crate-type = ["cdylib"]

[dependencies]

[build-dependencies]
cbindgen = "0.6.2"

दुर्भाग्य से आरएलएस (रस्ट लैंग्वेज सर्वर) बिल्ड स्क्रिप्ट सक्रिय होने पर बहुत अच्छी तरह से काम नहीं करता है जो वीएस कोड में संपादन को अप्रिय बनाता है। क्या बिल्ड स्क्रिप्ट को वैकल्पिक रूप से चलाने का कोई तरीका है, इसे डिफ़ॉल्ट रूप से अक्षम करना और कमांड-लाइन पर अनुरोध किए जाने पर केवल इसे मैन्युअल रूप से सक्षम करना (यानी cargo build --release --enable-build-scripts जैसा कुछ)?

3
blerontin 20 सितंबर 2018, 12:50

2 जवाब

सबसे बढ़िया उत्तर

आप सशर्त रूप से बिल्ड स्क्रिप्ट को अक्षम नहीं कर सकते हैं या cargo build के माध्यम से उन्हें वेरिएबल पास नहीं कर सकते हैं, लेकिन आप इसके बजाय पर्यावरण चर का उपयोग कर सकते हैं।

आपके अंदर build.rs:

use std::env;

fn main() {  
    let build_enabled = env::var("BUILD_ENABLED")
        .map(|v| v == "1")
        .unwrap_or(true); // run by default

    if build_enabled {
        // do your build
    }
}

अपनी बिल्ड स्क्रिप्ट के साथ बनाएँ:

BUILD_ENABLED=1 cargo build

अपनी बिल्ड स्क्रिप्ट के बिना बनाएं:

BUILD_ENABLED=0 cargo build
6
Peter Hall 20 सितंबर 2018, 13:38

@PeterHall से उत्तर का विस्तार करने के लिए कोई कार्गो का उपयोग कर सकता है बिल्ड स्क्रिप्ट पर जानकारी पास करने के लिए "फीचर्स" सेक्शन।

निम्नलिखित पंक्तियों को Cargo.toml में डालें:

[features]
headers = []

फिर build.rs में पर्यावरण चर CARGO_FEATURE_HEADERS की जांच करें:

use std::env;

fn write_headers() {
    // call cbindgen ...
}

fn main() {
    let headers_enabled = env::var_os("CARGO_FEATURE_HEADERS").is_some();
    if headers_enabled {
        write_headers();
    }
}

रिलीज़ बिल्ड रन करने के लिए cargo build --features=headers --release.

अब यह समाधान तब भी बिल्ड स्क्रिप्ट और सभी cbindgen निर्भरता को संकलित करता है जब RLS अपनी स्थिति को अद्यतन करता है या जब मैन्युअल रूप से cargo test चल रहा होता है। लेकिन cbindgen रन-टाइम त्रुटियाँ अब RLS को बाधित नहीं करती हैं।

3
blerontin 20 सितंबर 2018, 15:01