我正在处理一个程序宏,该宏需要一个位置来在运行它的系统上存储状态。运行cargo clean
时应清除状态。
过去,我假设target
目录是正确的位置。但是,我的假设可能不正确,因为:
rustc
和cargo
的文件和目录冲突。为了避免出现这些问题,我一直在尝试确定一种正确定位位置的方法,但是并没有成功。我发现最接近的是Cargo为构建脚本设置的环境变量OUT_DIR
,不幸的是,它不是为程序宏运行设置的。
请注意,此问题不是Is it possible to store state within Rust's procedural macros?的重复。这个问题通常涵盖程序宏状态,而这个问题是关于确定板条箱文件结构中的合适位置的。
答案 0 :(得分:0)
看来,存储临时文件(在编译运行期间持久存在并由Cargo清理)的最佳位置是走私Cargo为构建脚本设置的临时目录的位置(OUT_DIR
)到其余的编译环境。
请记住,使用宏的任何板条箱都将使用 相同目录 。确保设计宏,以便宏的多个并发实例可以同时使用同一目录而不会发生冲突。
分步解决方案:
将以下行放入程序宏板条箱的构建脚本中:
println!("cargo:rustc-env=PROC_ARTIFACT_DIR={}", std::env::var("OUT_DIR").unwrap())
在过程宏中使用env!("PROC_ARTIFACT_DIR")
获取状态目录的路径。
请注意,这只是一个变通办法,直到Cargo为程序宏板条箱的临时目录提供本机支持。该方法的功劳归于@sven-marnach。