🔨

wasm-opt で [parse exception: expected more elements in list] エラーが発生した

2024/08/13に公開

wasm-bindgen を使用したプロジェクトで表題のようなエラーが出て苦しんだので備忘録として解決法を残しておきます。

TL;DR

pkg/ ディレクトリにある XXX_bg.wasm-opt.wasm を削除してリビルドします。

環境

  • macOS Sonoma 14.2
  • MacBook Air M2, 2022
  • rustc 1.80.0 (051478957 2024-07-21)
  • cargo 1.80.0 (376290515 2024-07-16)

Cargo.toml

[package]
edition = "2021"

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
wasm-bindgen = "0.2.92"
# ...

発生したこと

あるタイミングから突然次のようなエラーメッセージが出るようになり、ビルドに失敗するようになってしまいました。

[INFO]: Optimizing wasm binaries with `wasm-opt`...
[INFO  wasm_pack::child] Running ".../wasm-opt" ".../pkg/XXX_bg.wasm-opt.wasm" "-o" ".../pkg/XXX_bg.wasm-opt.wasm-opt.wasm" "-O"
[parse exception: expected more elements in list]
Fatal: error parsing wasm (try --debug for more info)
Error: failed to execute `wasm-opt`: exited with exit status: 1
  full command: ".../wasm-opt" ".../pkg/XXX_bg.wasm-opt.wasm" "-o" ".../pkg/XXX_bg.wasm-opt.wasm-opt.wasm" "-O"
To disable `wasm-opt`, add `wasm-opt = false` to your package metadata in your `Cargo.toml`.
Caused by: failed to execute `wasm-opt`: exited with exit status: 1

試したこと

  • エラー文にある通り Cargo.toml[package] セクションに metadata = { wasm-opt = false } を追加
    • 解決せず
  • target/ ディレクトリと Cargo.lock の削除
    • 解決せず
  • cargo clean の実行
    • 解決せず

解決

GitHub を軽く漁ったところ、次のような issue を見つけました:
https://github.com/WebAssembly/binaryen/issues/5926

ここには次のような記述があります:

I eventually realized the problem was the existence of an empty file named ${name}_bg.wasm-opt.wasm in my pkg/ directory. Presumably it was left over from a prior run of wasm-{pack,opt} that failed to clean up after itself. The references to pkg/*_bg.wasm-opt.wasm-opt.wasm (note the double .wasm-opt) was a clue, in retrospect.

どうやら空の XXX_bg.wasm-opt.wasm ファイルが pkg/ 以下にあることが原因なようです。自分の環境でも調べてみたところ、同じような空のファイルがあったため削除しました。削除後、無事にビルドが通りまし;た。

自分の環境だと特に cargo watch -- wasm-pack build --target web --out-dir web/pkg のような形でファイルの変更に応じて自動的にビルドが走るようになっているのですが、ビルド中に git ブランチを切り替えるなどをしてしまったことによってビルドが不完全になってしまったものだと推察しています。

今回は以上です。

Discussion