使用--manifest-path编译Rust工作区致相对文件路径失效
解决Rust服务器配置文件路径问题
问题根源
你用相对路径./vrp-api/config/config.telemetry.json引用配置文件,开发时在仓库根目录执行cargo run,此时当前工作目录就是仓库根,相对路径能正确指向文件。但通过Python用--manifest-path启动时,当前工作目录是Python进程的工作目录,不是Rust项目的根目录,导致相对路径失效。
可行解决方案
方案1:编译时注入包目录路径(推荐)
Rust提供env!("CARGO_MANIFEST_DIR")宏,编译时会自动替换为当前包(vrp-api)的绝对路径。修改main.rs里的路径定义:
const BASE_CONFIG_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/config/config.telemetry.json");
这样不管从哪个目录启动二进制,路径都是编译时确定的绝对路径,完全避免相对路径问题。
方案2:启动时指定工作目录
在Python调用cargo run时,通过cwd参数将工作目录设置为Rust仓库的根目录(也就是克隆后的{self.base}/rust),和开发时的运行环境保持一致:
subprocess.call( [ "cargo", "run", "--bin", "vrp-api", "--manifest-path", f"{self.base}/rust/vrp-api/Cargo.toml" ], cwd=f"{self.base}/rust" )
这种方式不需要修改Rust代码,直接让相对路径基于正确的工作目录解析。
方案3:将配置文件嵌入二进制
如果不想依赖外部文件,可以用Rust的include_str!宏把配置文件内容直接嵌入二进制:
const BASE_CONFIG: &str = include_str!("../config/config.telemetry.json");
也可以用rust-embed crate批量嵌入静态资源,适合需要多个配置文件的场景。
为什么之前的方法无效
你尝试的--remap-path-prefix是用来修改编译产物中记录的文件路径(比如调试信息里的路径),和运行时的相对路径解析完全无关,所以无法解决问题。
内容的提问来源于stack exchange,提问作者roganjosh
相关产品推荐
相关产品推荐

