📦

cargo-component 0.9.0への移行

2024/04/07に公開

cargo-componentはバージョン0.9.0で、次のような破壊的な変更が入っています:

  • exportマクロの呼び出しが再び必要になりました
  • bitflagsのfeatureを有効にしたwit-bindgen-rtが必要になりました
  • リソースの実装はコードの変更が必要です
  • 次のCargo.tomlの属性が無効になっています
    • package.metadata.component.bindings.implementor
    • package.metadata.component.bindings.implementor

上記への対応を節を分けて説明します。

exportマクロの呼び出しを追加

0.7.0で不要になったexportマクロの呼び出しが必須となりました。呼び出さない場合、次のようなエラーが発生します:

error: module does not export required function `<name>`

lib.rsの末尾で次のようにexportマクロを呼び出すことで、上記のエラーを修正できます。なおComponentはコンポーネントを実装した構造体の名前です。自身の実装に合わせて置き換えてください。

bindings::export!(Component with_types_in bindings);

wit-bindgen-rtを依存するライブラリーに追加

以前はwit-bindgenで提供されていた関数のいくつかがwit-bindgen-rtに移されています。そのため、次のようなビルドエラーが発生するようになりました:

error[E0433]: failed to resolve: use of undeclared crate or module `wit_bindgen_rt`
  --> rust-project/src/bindings.rs:17:5
   |
17 |     wit_bindgen_rt::maybe_link_cabi_realloc();
   |     ^^^^^^^^^^^^^^ use of undeclared crate or module `wit_bindgen_rt`
   |
help: there is a crate or module with a similar name
   |
17 |     wit_bindgen::maybe_link_cabi_realloc();
   |     ~~~~~~~~~~~

上記のエラーは次のように依存するライブラリーを更新することで修正できます。

  • wit-bindgenを削除
  • wit-bindgen-rtを追加
  • bitflasgsを追加

更新は次のようにコマンドで行えます:

% cargo remove wit-bindgen
% cargo add wit-bindgen-rt
% cargo add bitflags

リソースの実装コードの変更

次のようなリソースがあったとします:

https://github.com/chikoski/wasm-component-rust-snippets/blob/main/component-composition/wit/resource.wit

以前は次のように実装していました。GuestMessage::get_messagewit_bindgen::Resource<Message>であることに注意してください。

今回の更新によってwit_bindgen::Resourceが解決できなくなりました。これに伴い、次のようにコードを変更します。

  • use wit_bindgen::Resource;をコードから削除
  • use bindings::exports::component::composition::message_handlable::Message;を追加
  • GuestMessage::get_messageの返り値の型をMessageに変更し、型に合うようにコードを変更
  • Guestトレイトの実装にtype Message = MessageImpl;を追加

変更したコードは次のようになります:

https://github.com/chikoski/wasm-component-rust-snippets/blob/279d42afe97754d203a2580322a0caf21717acbc/component-composition/resource-handler/src/lib.rs

Discussion