Automatisches Ink-Build on Engine build
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
//! Build-Hook: kompiliert geänderte Ink-Dialoge automatisch beim Cargo-Build.
|
||||
//!
|
||||
//! Reines „Wann"-Stück — das eigentliche Bauen macht `tools/build-dialogues.sh`
|
||||
//! (und bleibt von Hand aufrufbar). Hier melden wir Cargo nur, wann es uns
|
||||
//! erneut ausführen soll, und stoßen das Skript an.
|
||||
//!
|
||||
//! Cargo führt build.rs ausschließlich dann erneut aus, wenn eine der unten
|
||||
//! via `rerun-if-changed` gemeldeten Dateien sich ändert. Unveränderte
|
||||
//! Rebuilds kosten also nichts; nur nach einer `.ink`-Änderung läuft
|
||||
//! inklecate (inkrementell nur für die betroffene Datei).
|
||||
|
||||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
|
||||
fn main() {
|
||||
let root = env!("CARGO_MANIFEST_DIR");
|
||||
let script = Path::new(root).join("tools/build-dialogues.sh");
|
||||
let ink_dir = Path::new(root).join("assets/interactions");
|
||||
|
||||
// Wann soll Cargo build.rs erneut ausführen?
|
||||
println!("cargo:rerun-if-changed=tools/build-dialogues.sh");
|
||||
println!("cargo:rerun-if-changed=tools/inklecate");
|
||||
// Verzeichnis-mtime fängt neu hinzugekommene/gelöschte .ink-Dateien.
|
||||
println!("cargo:rerun-if-changed=assets/interactions");
|
||||
// Inhaltsänderungen einzelner .ink-Dateien einzeln melden.
|
||||
if let Ok(entries) = std::fs::read_dir(&ink_dir) {
|
||||
for entry in entries.flatten() {
|
||||
let p = entry.path();
|
||||
if p.extension().and_then(|s| s.to_str()) == Some("ink") {
|
||||
println!("cargo:rerun-if-changed={}", p.display());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Skript ausführen. Ausgabe einsammeln, damit ein Dialog-Fehler sichtbar
|
||||
// wird (Cargo blendet Build-Script-stdout sonst aus).
|
||||
match Command::new("bash").arg(&script).output() {
|
||||
Ok(out) if out.status.success() => { /* still bei Erfolg */ }
|
||||
Ok(out) => {
|
||||
let stdout = String::from_utf8_lossy(&out.stdout);
|
||||
let stderr = String::from_utf8_lossy(&out.stderr);
|
||||
for line in stdout.lines().chain(stderr.lines()) {
|
||||
println!("cargo:warning={line}");
|
||||
}
|
||||
panic!(
|
||||
"Dialog-Build fehlgeschlagen — siehe Warnungen oben. \
|
||||
Einzeln debuggen: ./tools/build-dialogues.sh"
|
||||
);
|
||||
}
|
||||
Err(e) => {
|
||||
// bash/Skript nicht startbar (z.B. fremdes OS): den Build nicht
|
||||
// blockieren, nur warnen — die committeten .ink.json reichen.
|
||||
println!(
|
||||
"cargo:warning=Dialog-Build übersprungen ({e}). \
|
||||
Bei Bedarf von Hand: ./tools/build-dialogues.sh"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user