Rust/Wasm: Module not found: Error: Can't resolve 'env' in
Rust/Wasm: Module not found: Error: Can't resolve 'env' in
我正在尝试将 wrapper for this crate 移植到 wasm 中。我当前的工具链是:
- wasm-pack
- webpack
- wasm-绑定
关于构建系统的更多信息:
在我的 rust crate(这是一个 --lib
crate)中,我只调用 wasm-pack build --target browser
。这将创建一个 pkg
文件夹,其中包含 wasm blob 和关联的 js 文件。这里没有来自编译器的抱怨。
然后,在 pkg
中,我 运行 npm link
(仅一次)。
然后,cargo generate --git https://github.com/rustwasm/wasm-pack-template
创建所需的网络应用样板。在此命令生成的文件夹中,我 运行 npm link schnorrkel-js
使其可见。 npm run start
运行 是 webpack 开发服务器。
像绑定简单计算函数和警报这样的初步测试工作正常。
当我开始使用上述板条箱 (example) 中的 some(不是 any)函数时,一切都崩溃了。不幸的是,我收到的错误消息信息量不大,根本没有帮助:
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 但究竟是哪一个,为什么,以及错误消息试图说什么?
备注:
我正在使用最新的 rust nightly 版本 (rustc 1.34.0-nightly (d17318011 2019-02-07)
)
其余设置步骤直接取自 Rust and Webassembly book。
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)
}
看起来这可能是 clear_on_drop
依赖项使用的 C 代码的问题,如前所述 here。
尝试在 schnorrkel
crate 上启用 nightly
功能,这反过来会在 clear_on_drop
上启用 nightly
功能,从而禁用其对 C 的使用。在您的 Cargo.toml
:
[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] }
或者,您可以在已编译的 .wasm
二进制文件上使用 wasm2wat
(有 an online version)来检查哪个 env
导入失败。
我正在尝试将 wrapper for this crate 移植到 wasm 中。我当前的工具链是:
- wasm-pack
- webpack
- wasm-绑定
关于构建系统的更多信息:
在我的 rust crate(这是一个 --lib
crate)中,我只调用 wasm-pack build --target browser
。这将创建一个 pkg
文件夹,其中包含 wasm blob 和关联的 js 文件。这里没有来自编译器的抱怨。
然后,在 pkg
中,我 运行 npm link
(仅一次)。
然后,cargo generate --git https://github.com/rustwasm/wasm-pack-template
创建所需的网络应用样板。在此命令生成的文件夹中,我 运行 npm link schnorrkel-js
使其可见。 npm run start
运行 是 webpack 开发服务器。
像绑定简单计算函数和警报这样的初步测试工作正常。
当我开始使用上述板条箱 (example) 中的 some(不是 any)函数时,一切都崩溃了。不幸的是,我收到的错误消息信息量不大,根本没有帮助:
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 但究竟是哪一个,为什么,以及错误消息试图说什么?
备注:
我正在使用最新的 rust nightly 版本 (
rustc 1.34.0-nightly (d17318011 2019-02-07)
)其余设置步骤直接取自 Rust and Webassembly book。
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)
}
看起来这可能是 clear_on_drop
依赖项使用的 C 代码的问题,如前所述 here。
尝试在 schnorrkel
crate 上启用 nightly
功能,这反过来会在 clear_on_drop
上启用 nightly
功能,从而禁用其对 C 的使用。在您的 Cargo.toml
:
[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] }
或者,您可以在已编译的 .wasm
二进制文件上使用 wasm2wat
(有 an online version)来检查哪个 env
导入失败。