はじめに
WASM Componentとして、実装のボイラープレートを生成するツールとしてwit-bindgen-cliがある。
このツールはwit定義から生成するのだが、他のパッケージに依存する場合は 所定のフォルダ構成 で事前に依存解決しておく必要がある。
wit-deps-cliはこの依存解決を行うツール。
wit-deps-cli 0.6.0でちょっとした仕様変更により、どハマりしたのでその内容を記録として残す。
TL;DR
deps.tomlにて以下のようにprefixを指定することでアーカイブ内のサブフォルダを依存として取り込むことができる。
filesystem = { url = "https://github.com/WebAssembly/WASI/archive/refs/tags/v0.2.9.tar.gz", prefix = "WASI-0.2.9/proposals/filesystem/wit" }
バージョン0.5.0
wit-deps-cli 0.5.0でsubdirが追加され、アーカイブ内の展開元を指定することができるようになった。
これは、2025年はWASI Preview3を策定中であり、WASI Preview2の安定版のwitとドラフト版のwitが同梱された状態であり、どちらを使用するのか明示的に指定する必要に迫られたから(と推測する)。
例えばWebAssembly/wasi-clocksレポジトリが配布するv0.2.8のアーカイブのunzipは以下のフォルダ構成
wasi-clocks-0.2.8
wasi-clocks-0.2.8
├── README.md
├── imports.md
├── test
│ └── README.md
├── wit/
└── wit-0.3.0-draft/
deps.tomlにて以下のように指定することでドラフト版のwit`を展開することができた。
clocks = { url = "https://github.com/WebAssembly/wasi-clocks/archive/refs/tags/v0.2.8.tar.gz", subdir = "wit-0.3.0-draft" }
しかしsubdirにはひとつ問題があり、直下のフォルダしか指定することができなかった。
これはv0.2.9から、同一のスコープのパッケージ、即ちwasiのものがひとつのアーカイブとして統合され、WebAssembly/WASIのレポジトリから提供されるようになったことで影響を受けるようになった。
このアーカイブのフォルダ構成は以下
WASI-0.2.9
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── assets/
├── docs/
├── legacy/
├── proposals
│ ├── cli/
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── command.md
│ │ ├── imports.md
│ │ ├── test
│ │ ├── wit/
│ │ └── wit-0.3.0-draft/
│ ├── clocks
│ │ ├── README.md
│ │ ├── imports.md
│ │ ├── test/
│ │ ├── wit/
│ │ └── wit-0.3.0-draft/
│ ├── filesystem
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── imports.md
│ │ ├── path-resolution.md
│ │ ├── test/
│ │ ├── wit/
│ │ └── wit-0.3.0-draft/
│ ├── http
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── imports.md
│ │ ├── proxy.md
│ │ ├── wit/
│ │ └── wit-0.3.0-draft/
│ ├── io
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── imports.md
│ │ ├── test/
│ │ ├── wit/
│ ├── random
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── imports.md
│ │ ├── test/
│ │ ├── wit/
│ │ └── wit-0.3.0-draft/
│ └── sockets
│ ├── GrantingAccess.md
│ ├── LICENSE.md
│ ├── Posix-compatibility.md
│ ├── README.md
│ ├── TcpSocketOperationalSemantics-0.3.0-draft.md
│ ├── TcpSocketOperationalSemantics.md
│ ├── imports.md
│ ├── test
│ ├── wit/
│ └── wit-0.3.0-draft/
└── specifications/
直下ではなくproposalsの下に置かれている。そのため0.2.9のアーカイブからは指定したパッケージのwitを展開することができなくなってしまった。
バージョン0.6.0
wit-deps-cli 0.6.0で対策が講じられた。
subdirの指定が 廃止 され1、新たに prefix が追加された。
prefixではsubdirのときとは異なり複数フォルダ下であっても指定することができるようになった。
ただし注意点がひとつ。prefixという名からもわかるようにルートフォルダから指定する必要がある。
例えば、wasi:clocksであれば、以下のようにdeps.tomlに指定する。
以下の例はv0.2.9のアーカーブを使用する場合。mainブランチのアーカイブであれば/WASI-main/...となることに注意
clocks = { url = "https://github.com/WebAssembly/WASI/archive/refs/tags/v0.2.9.tar.gz", prefix = "WASI-0.2.9/proposals/clocks" }
もしくは、以下のようにwitフォルダまで明示的に指定することも可能(ドラフト版を指定する場合はこっち)
clocks = { url = "https://github.com/WebAssembly/WASI/archive/refs/tags/v0.2.9.tar.gz", prefix = "WASI-0.2.9/proposals/clocks/wit-0.3.0-draft" }
おわりに
subdirやprefixの指定については、レポジトリのREADME.mdには書かれてなく、CHANGELOG.mdに変更点としてひっそりと書かれているだけである。
この記事がwit-deps-cliを使う上での障害を取り除ければ幸いである。
いじょ!
-
そんなフィールド知らねーよってメッセージが出て????ってなった。 ↩