什么地方适合存储程序宏构件,以便通过“货物清理”进行清理?

时间:2019-05-20 06:36:49

标签: rust rust-cargo rust-proc-macros

我正在处理一个程序宏,该宏需要一个位置来在运行它的系统上存储状态。运行cargo clean时应清除状态。

过去,我假设target目录是正确的位置。但是,我的假设可能不正确,因为:

  1. 我的文件和目录可能与rustccargo的文件和目录冲突。
  2. 目标目录的位置可以从默认位置更改。

为了避免出现这些问题,我一直在尝试确定一种正确定位位置的方法,但是并没有成功。我发现最接近的是Cargo为构建脚本设置的环境变量OUT_DIR,不幸的是,它不是为程序宏运行设置的。

请注意,此问题不是Is it possible to store state within Rust's procedural macros?的重复。这个问题通常涵盖程序宏状态,而这个问题是关于确定板条箱文件结构中的合适位置的。

1 个答案:

答案 0 :(得分:0)

看来,存储临时文件(在编译运行期间持久存在并由Cargo清理)的最佳位置是走私Cargo为构建脚本设置的临时目录的位置(OUT_DIR)到其余的编译环境。

请记住,使用宏的任何板条箱都将使用 相同目录 。确保设计宏,以便宏的多个并发实例可以同时使用同一目录而不会发生冲突。

分步解决方案:

  1. 将以下行放入程序宏板条箱的构建脚本中:

    println!("cargo:rustc-env=PROC_ARTIFACT_DIR={}", std::env::var("OUT_DIR").unwrap())
    
  2. 在过程宏中使用env!("PROC_ARTIFACT_DIR")获取状态目录的路径。

请注意,这只是一个变通办法,直到Cargo为程序宏板条箱的临时目录提供本机支持。该方法的功劳归于@sven-marnach