Rust/Wasm: модуль не найден: ошибка: не удается разрешить 'env' в
Я пытаюсь перенести упаковщик для этого ящика в wasm. Мой текущий набор инструментов:
- wasm-пак
- WebPack
- wasm-bindgen
Немного больше информации о системе сборки:
В моем ржавом ящике (который является --lib
ящик), я звоню только wasm-pack build --target browser
, Это создаст pkg
папка, содержащая BLOB-объекты wasm и связанные файлы js. Нареканий от компилятора здесь нет.
Тогда внутри pkg
, Я бегу npm link
(только раз).
Затем, cargo generate --git https://github.com/rustwasm/wasm-pack-template
создает необходимый шаблон веб-приложения. Внутри папки, сгенерированной этой командой, я запускаю npm link schnorrkel-js
сделать это видимым. npm run start
запускает сервер разработки веб-пакетов.
начальные тесты, такие как связывание простых функций расчета и оповещения, работают нормально.
Все ломается, когда я начинаю использовать некоторые (не любые) функции из упомянутого ящика ( пример). К сожалению, сообщение об ошибке, которое я получаю, является неинформативным и не помогает вообще:
Entrypoint main = bootstrap.js
[../pkg/schnorrkel_js.js] 3.53 KiB {0} [built]
[../pkg/schnorrkel_js_bg.wasm] 93.7 KiB {0} [built]
+ 27 hidden modules
ERROR in ../pkg/schnorrkel_js_bg.wasm
Module not found: Error: Can't resolve 'env' in '.../schnorrkel-js/pkg'
@ ../pkg/schnorrkel_js_bg.wasm
@ ../pkg/schnorrkel_js.js
@ ./index.js
@ ./bootstrap.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./bootstrap.js
Какова причина этого? У меня есть сильное предположение, что некоторые базовые функции не переносимы в wasm, а какие именно, почему и что пытается сказать сообщение об ошибке?
заметки:
Я использую последнюю версию ржавчины ночной (
rustc 1.34.0-nightly (d17318011 2019-02-07)
)остальные шаги по настройке взяты непосредственно из книги Rust and Webassembly.
Cargo.toml
[package]
name = "schnorrkel-js"
edition = "2018"
[lib]
crate-type = ["cdylib"]
[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git" }
Пример кода:
#[wasm_bindgen]
pub fn verify(signature: &[u8], message: &[u8], pubkey: &[u8]) -> bool {
let sig = match Signature::from_bytes(signature) {
Ok(some_sig) => some_sig,
Err(_) => return false
};
let pk = match PublicKey::from_bytes(pubkey) {
Ok(some_pk) => some_pk,
Err(_) => return false
};
// works up until here if I return a boolean.
// calling this breaks everything.
pk.verify_simple(SIGNING_CTX, message, &sig)
}
1 ответ
Похоже, это может быть проблемой с кодом C, используемым clear_on_drop
зависимость, как уже упоминалось здесь.
Попробуйте включить nightly
особенность на schnorrkel
ящик, который в свою очередь позволяет nightly
особенность на clear_on_drop
что отключает его использование C. На вашем Cargo.toml
:
[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] }
Кроме того, вы можете использовать wasm2wat
(есть онлайн-версия) на вашем скомпилированном .wasm
двоичный файл, чтобы проверить, какие env
импорт не выполняется.