#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:
Первая и вторая ошибки не связаны:
- Сбой, потому что процесс был остановлен «где-то» (комментарии, похоже, решили эту проблему).
- Сбой, потому что
CARGO_MANIFEST_DIR
устанавливаетсяcargo
, поэтому, если вы запускаетеrustc
вручную, вам придется устанавливать переменную самостоятельно, обычно старайтесь вообще не запускатьrustc
вручную.
Комментарии:
1. Предложение по предотвращению
rustc
и использованиюcargo
в целом является полезной информацией, и этот вопрос / ответ показывает конкретный пример, почему.