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

Ten*_*ken 5 rust rust-cargo rust-proc-macros

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

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

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

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

请注意,此问题不是“ 是否可以在Rust的程序宏中存储状态?”的重复项。这个问题通常涵盖程序宏状态,而这个问题是关于在包装箱的文件结构中确定合适的位置。

Ten*_*ken 3

看来存储临时文件的最佳位置是使用:(1)在编译运行期间持续存在并且(2)也被 Cargo 清理OUT_DIR

\n
\n

OUT_DIR\xe2\x80\x94 如果包有构建脚本,则将其设置为构建脚本应放置其输出的文件夹。请参阅下面的详细信息。(仅在编译期间设置。)

\n
\n

如果我没记错的话,此环境变量仅可用于构建脚本,因此您必须使用构建脚本来公开板条箱其余部分的路径。请注意,它OUT_DIR 与任何使用宏进行给定编译运行的包共享,因此您需要以使用该目录的方式来考虑这一点以避免冲突。

\n

该解决方案分步骤:

\n
    \n
  1. OUT_DIR通过将以下行添加到程序宏包的构建脚本中,将其重新导出到包的其余部分:

    \n
     println!("cargo:rustc-env=PROC_ARTIFACT_DIR={}", \n          std::env::var("OUT_DIR").unwrap() )\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 在程序宏中使用env!("PROC_ARTIFACT_DIR")来获取状态目录的路径。

    \n
  4. \n
\n

在 Cargo 正确支持临时目录(?)之前,这只能作为临时解决方法。此方法的全部功劳归功于@sven-marnach

\n