Приложение Rust не может скомпилироваться из-за отсутствия переменной среды CARGO_MANIFEST_DIR

#rust #rust-cargo

#Ржавчина #rust-cargo

Вопрос:

Недавно я добавил зависимость к своему приложению Rust, которое содержит процедурный макрос. Этот процедурный макрос вызывается с помощью i18n_codegen::i18n!("locales"); . Он найдет все файлы в locales каталоге относительно CARGO_MANIFEST_DIR . Насколько я понимаю, CARGO_MANIFEST_DIR является корнем вашего ящика и устанавливается Cargo.

Локально это работает нормально, но когда я пытаюсь собрать его на своем сервере CI, он выдает следующее сообщение:

 root@9eb2477f8a48:~# cd ./project/
root@9eb2477f8a48:~/project# cargo build --tests
   Compiling i18n v0.1.0 (/root/project/i18n)
   Compiling diesel-factories v0.0.1
   Compiling rocket_contrib v0.4.0
error: Could not compile `i18n`.

Caused by:
  process didn't exit successfully: `rustc --edition=2018 --crate-name i18n i18n/src/lib.rs --color always --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=7a0984ff3e085e3a -C extra-filename=-7a0984ff3e085e3a --out-dir /root/project/target/debug/deps -C incremental=/root/project/target/debug/incremental -L dependency=/root/project/target/debug/deps --extern i18n_codegen=/root/project/target/debug/deps/libi18n_codegen-85460420d23be67d.so` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: Could not compile `i18n`.
  

Выполнение команды rustc дает

 root@9eb2477f8a48:~/project# rustc --edition=2018 --crate-name i18n i18n/src/lib.rs --color always --crate-type lib --emit=dep-info,link -C debuginfo=2 -C metadata=7a0984ff3e085e3a -C extra-filename=-7a0984ff3e085e3a --out-dir /root/project/target/debug/deps -C incremental=/root/project/target/debug/incremental -L dependency=/root/project/target/debug/deps --extern i18n_codegen=/root/project/target/debug/deps/libi18n_codegen-85460420d23be67d.so
error: proc macro panicked
 --> i18n/src/lib.rs:1:1
  |
1 | i18n_codegen::i18n!("locales");
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: message: Env var `CARGO_MANIFEST_DIR` was missing

error: aborting due to previous error
  

Похоже, что CARGO_MANIFEST_DIR отсутствует… Как это может быть? Я думал, что это всегда задается Cargo? Я предполагаю, что она может отсутствовать при rustc непосредственном запуске, но как она может отсутствовать и при запуске cargo build --tests ?

Код, который находит переменную env, находится здесь https://github.com/davidpdrsn/i18n_codegen/blob/master/src/lib.rs#L233 .

Само основное приложение представляет собой грузовое рабочее пространство с несколькими другими ящиками внутри, не уверен, имеет ли это значение.

Я использую одну и ту же версию Rust nightly локально и на CI.

Это рабочий проект с закрытым исходным кодом, поэтому, к сожалению, я не могу легко поделиться им.

Комментарии:

1. ну, здесь вы путаете две проблемы, если вы запустите с rustc , очевидно, что элемент cargo будет отсутствовать! Но похоже, что rustc был уничтожен ОС, это похоже на ошибку где-то, недостаточно оперативной памяти?

2. «Это рабочий проект с закрытым исходным кодом, поэтому, к сожалению, я не могу легко поделиться им». Надеюсь, вы сможете создать отдельный проект, который воспроизводит ту же проблему. И, учитывая, что вы используете набор инструментов nightly, важно указать, какой именно.

3. @Stargateur Похоже, именно поэтому. Я выполнил локальную чистую сборку, и использование памяти rustc достигло максимума в 6 ГБ 😞 Спасибо за помощь!

Ответ №1:

Первая и вторая ошибки не связаны:

  1. Сбой, потому что процесс был остановлен «где-то» (комментарии, похоже, решили эту проблему).
  2. Сбой, потому что CARGO_MANIFEST_DIR устанавливается cargo , поэтому, если вы запускаете rustc вручную, вам придется устанавливать переменную самостоятельно, обычно старайтесь вообще не запускать rustc вручную.

Комментарии:

1. Предложение по предотвращению rustc и использованию cargo в целом является полезной информацией, и этот вопрос / ответ показывает конкретный пример, почему.