Ich hostet ein Rust-Projekt in Git-Repository und ich möchte es die Version auf einen Befehl drucken. Wie kann ich die Version in das Programm aufnehmen? Ich dachte, dass die Build-Skript Umgebungsvariablen könnte, die verwendet werden können, während das Projekt selbst kompilieren, aber es funktioniert nicht:Include git commit Hash als String in Rust-Programm
build.rs:
use std::env;
fn get_git_hash() -> Option<String> {
use std::process::Command;
let branch = Command::new("git")
.arg("rev-parse")
.arg("--abbrev-ref")
.arg("HEAD")
.output();
if let Ok(branch_output) = branch {
let branch_string = String::from_utf8_lossy(&branch_output.stdout);
let commit = Command::new("git")
.arg("rev-parse")
.arg("--verify")
.arg("HEAD")
.output();
if let Ok(commit_output) = commit {
let commit_string = String::from_utf8_lossy(&commit_output.stdout);
return Some(format!("{}, {}",
branch_string.lines().next().unwrap_or(""),
commit_string.lines().next().unwrap_or("")))
} else {
panic!("Can not get git commit: {}", commit_output.unwrap_err());
}
} else {
panic!("Can not get git branch: {}", branch.unwrap_err());
}
None
}
fn main() {
if let Some(git) = get_git_hash() {
env::set_var("GIT_HASH", git);
}
}
src/main.rs:
pub const GIT_HASH: &'static str = env!("GIT_HASH");
fm main() {
println!("Git hash: {}", GIT_HASH);
}
Die Fehlermeldung:
error: environment variable `GIT_HASH` not defined
--> src/main.rs:10:25
|
10 | pub const GIT_HASH: &'static str = env!("GIT_HASH");
|
^^^^^^^^^^^^^^^^
Gibt es eine Möglichkeit, solche Daten zur Kompilierzeit zu übergeben? Wie kann ich zwischen dem Build-Skript und dem Quellcode kommunizieren, wenn nicht mit Umgebungsvariablen? Ich kann nur darüber nachdenken, Daten in eine Datei zu schreiben, aber ich denke, das ist für diesen Fall übertrieben.
Ich würde gerne ein Beispiel der Config-Flag-Version sehen. Ein Git-Hash muss jedoch nur 40 Zeichen lang sein. – Shepmaster
** in andere, Nicht-Kind-Prozesse ** Ich denke, das ist der Schlüssel, um hier zu realisieren. Das Build-Skript wird * vor * der Kompilierung der Bibliothek ausgeführt, nicht * um * es herum. – Shepmaster
@Shempmaster: Eine Flagge gibt Ihnen jedoch nur ein Bit. Sie haben etwas wie '# [cfg (bit_0)] const BIT_0: u8 = 1; # [cfg (nicht (bit_0))] const BIT_0: u8 = 0; 160 mal. Ich * habe * etwas ähnliches in der Vergangenheit nicht ratsam gemacht ... \ ** pfeift * \ * –