6

我正在研究一个程序宏,它需要一个地方来在运行它的系统上存储状态。运行时应清理状态cargo clean

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

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

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

请注意,此问题与是否可以在 Rust 的过程宏中存储​​状态?. 该问题通常涵盖程序宏状态,而该问题是关于确定 crate 文件结构中的合适位置。

4

1 回答 1

2

似乎存储临时文件的最佳位置(在编译运行中持续存在并且也被 Cargo 清理)是将 Cargo 为构建脚本(OUT_DIR)设置的临时目录的位置走私到编译环境的其余部分。

需要记住的一件事是,任何使用您的宏的 crate 都将使用同一个目录。确保设计您的宏,以便宏的多个并发实例可以同时使用同一个目录而不会发生冲突。

分步解决:

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

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

请注意,这只是一种解决方法,直到 Cargo 为程序宏 crate 的临时目录提供本机支持。这种方法的全部功劳归于@sven-marnach

于 2019-06-06T14:14:09.320 回答