Какое подходящее место для хранения процедурных макро-артефактов, чтобы их можно было очистить с помощью 'clean clean'? - PullRequest
5 голосов
/ 20 мая 2019

Я работаю над процедурным макросом, которому нужно место для хранения состояния в системе, в которой он запущен. Состояние должно быть очищено при запуске cargo clean.

Раньше я предполагал, что каталог target - правильное место. Тем не менее, мое предположение, скорее всего, неверно, потому что:

  1. мои файлы и каталоги могут конфликтовать с файлами rustc и cargo.
  2. расположение целевого каталога может отличаться от значения по умолчанию.

В попытке избежать этих проблем я пытался определить способ определения местоположения, но не увенчался успехом. Самым близким, что я нашел, является переменная окружения OUT_DIR, которую Cargo устанавливает для сценариев сборки, которая, к сожалению, не установлена ​​для процедурных макросов.

Обратите внимание, что этот вопрос не является дубликатом Можно ли сохранить состояние в процедурных макросах Rust? . Этот вопрос охватывает процедурное макросостояние в целом, в то время как этот вопрос касается определения подходящего местоположения в файловой структуре ящика.

1 Ответ

0 голосов
/ 06 июня 2019

Похоже, что лучшее место для хранения временных файлов (которые сохраняются во время выполнения компиляции, а также очищаются с помощью 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.

...