🤷

RustのHow toさがしかた

2025/04/09に公開

はじめに

たまにRustを書くことがある私ですが、Rustはエコシステムが安定しておらず、ググっても解決しなかったり、ニッチなライブラリを見つけてもライブラリの使い方がよく分からなかったり、あまりメンテナンスされていなかったり非推奨だったりして、ライブラリの移行先を探さないといけなかったり、まあとにかく大変です。

そこで今回は今までやってきたことを振り返りつつ、どのような方法で調べたらよいか紹介していきたいと思います。

Docker

私はActix WebやaxumのようなWebアプリケーションフレームワークを使いたいためにRustを始めたので、まず本番環境でも動かせるDocker環境を探す必要がありました。
特にHerokuのBuildpackのようなDockerfileを書かなくても簡単に動かせるDocker環境が欲しかったので、ググったりして以下のリポジトリを確認しました。

https://github.com/emk/heroku-buildpack-rust
https://github.com/emk/rust-musl-builder

しかしながら数年近くメンテナンスされていないため、本番環境で使うのはまずいなと思ったので、以下の方法で移行先を探しました。

Cloud Native Buildpacks

まずHerokuのBuildpackは最近Cloud Native Buildpacksという仕様やプロパイダーをオープンにしたものがありますので、ここのレジストリから検索してみることにします。

https://buildpacks.io/

https://registry.buildpacks.io/searches/rust

するとPaketoコミュニティという主要プロパイダーのPaketo Buildpacksのコミュリティ組織で運営しているBuildpacksが見つかります。

https://github.com/paketo-community/rust

チェックポイントは以下のとおりです。

  • Paketo Buildpacksは主要プロパイダーか
  • 他の主要プロパイダーであるHerokuやGoogleは公式で提供していないか
    • 現時点では提供していなかったため、消去法で決定できる
  • Activityをチェックして、直近で頻繁にコミットされているか
  • リポジトリや組織のREADME.mdを読んで注意事項が書いていないか(実験的、廃止など)

muslrust

上記Cloud Native Buildpacksだけでも十分だったのですが、RustのWebアプリケーションフレームワークはビルドするとわずか数MBのバイナリにできるので、Cloud Native BuildpacksのDockerイメージのサイズは少々大きく感じしてしまいます。
そこで最初にググって出てきたrust-musl-builderのREADME.mdを読んでみましょう。

UPDATED: This repository is effectively dead at this point, given the increasing rarity of crates which require OpenSSL.

どうやらOpenSSL Cratesが原因で事実上停止しているようです。
README.mdをスクロールしてみると……。

Other ways to build portable Rust binaries

If for some reason this image doesn't meet your needs, there's a variety of other people working on similar projects:

なんと類似プロジェクトが紹介されていました。
すべて確認した結果、muslrustを使うことにしました。

https://github.com/clux/muslrust

チェックポイントは以下のとおりです。

  • Built daily via github actions.と書かれている通り、毎日ビルドされている
  • The binaries and images for small apps generally end up <10MB compressed or ~20MB uncompressed without stripping.と書かれている通り、ビルドすると数MBのバイナリにできる目的を達成できる
    • 今回はさらにThe recommended production image is distroless static or chainguard staticと書かれており、自分の想定する本番環境プランを満たしていた
  • OpenSSL Cratesの問題を解決しているか
  • 他の類似プロジェクトと比較したか
    • 例えばcrossはCLIツールなので、Dockerfileのマルチステージビルドに適していない

実際に試した記事はこちら。

https://zenn.dev/tkithrta/articles/cb91f6c8246d9a

Crates

Dockerの問題も解決したので実際にライブラリを使って開発を始めると、以下の問題に直面します。

  • 1つのリポジトリで複数のライブラリを管理しており、どれを使ったらよいか分からない
  • 1つの組織で複数のライブラリを管理しており、どれを使ったらよいか分からない
  • リポジトリの例が多すぎてどれを見たらよいか分からないし、少し機能を追加したい時もやり方が分からない
  • ググっても古い情報が出てくる
  • そもそもニッチなライブラリなので例や情報すら出てこない

そんな時役に立つのが、crates.ioとdocs.rsです

https://crates.io/crates/axum
https://docs.rs/axum/latest/axum/

crates.ioの右メニューDocumentationからdocs.rsへ移動することもできますし、docs.rsの上メニューからcrates.ioへ移動することもできますので、この2つはセットで覚えておきましょう。

crates.io

まずcrates.ioではREADME.mdやMetadataだけではなく、依存関係を確認することができます。

https://crates.io/crates/axum/0.8.3/dependencies

他にもOwnerごとの管理しているCratesを確認することもできます。

https://crates.io/teams/github:tokio-rs:core

ただ初期状態ではアルファベット順にソートされたものが表示されるだけであまり役に立たないので、Sort byを変更して確認するようにしましょう。

目的 Sort by
実績ある安定したクレートが欲しい All-Time Downloads
今人気のクレートを見たい Recent Downloads
アクティブな開発がされているクレートが欲しい Recent Updates
新しくリリースされたクレートを探したい Newly Added

docs.rs

docs.rsはCratesの中身そのものをドキュメント形式で確認することができます。

Modulesを見れば大体分かりますが、ここでおすすめしたいのが、以下すべてのアイテムを表示してくれるページです。

https://docs.rs/axum/latest/axum/all.html

最初にMacrosのAPIを確認しましょう。

  1. Macros(マクロ)
    コードの繰り返しを減らし、より効率的で再利用可能なコードを書ける。特に処理が同じような部分が多い場合、マクロを使うことで可読性とメンテナンス性が向上する。
  2. Derive Macros(派生マクロ)
    #[derive(...)]で自動実装される機能。自分でトレイトを自動導出したい時やライブラリ側がどう使っているか見るときに便利。
  3. Attribute Macros(属性マクロ)
    #[some_attribute]のような形で使うカスタムマクロ。プロジェクトで使うなら把握必須だが、初心者にはやや難解。

続いてFunctions, Traits, StructsのAPIを確認しましょう。

  1. Functions(関数)
    トップレベルの便利関数や、ユーティリティが揃っている。小さなことを手っ取り早くしたいときに重要。
  2. Traits(トレイト)
    クレートの中心的なインターフェースを定義していることが多く、どういう操作や振る舞いが可能かがわかる。
  3. Structs(構造体)
    実際に使う「データの器」。どんなフィールドがあるか、どんなメソッドがあるかで使い方が明確になる。

他にもPrimitive Types(プリミティブ型)、Enums(列挙型)、Constants(定数)、Type Aliases(型エイリアス)、Unions(共用体)がありますが、Rustの標準ライブラリを確認するか、必要になったら確認する程度で大丈夫だと思います。

https://doc.rust-lang.org/stable/std/all.html

また、docs.rsではFeature flagsを確認することができます。

https://docs.rs/crate/axum/latest/features

crates.ioとは異なりFeatureごとに依存関係が分かり、default以外の機能も確認することができるのでとても便利です。

How to

https://zenn.dev/tkithrta/articles/70f0489ddcfe30

以前WASI専用のHTTPリクエストクライアント&Webサーバーライブラリのwakiを紹介しましたが、以下手順で使い方を調べました。

  1. crates.ioでREADME.md, Metadata, 依存関係を確認
    Dev-Dependenciesでwasmtimeを使えばいいことが分かる
  2. docs.rsでModules, Feature flags, default以外の機能を確認
    jsonとmultipartの機能が使えることが分かる
  3. MacrosのAPIを確認
    Attribute Macrosのhandlerしかないことが分かる
  4. Functions, Traits, StructsのAPIを確認
    Functionsがなく、Traitsも少ないのでStructsのメソッドを見れば良いことが分かる
  5. GitHubリポジトリの例を確認しながら使ってみる

ライブラリが増えても多分これが一番早いと思います。
何回かやっていくうちに異なるライブラリの組み合わせ方や、使用頻度の高いライブラリも分かってきます。

また有名なライブラリでググって出てきた古い情報が原因で動かない場合は、CHANGELOG.md, CHANGES.md, RELEASES.mdを確認して修正するのも有効です。

https://github.com/tokio-rs/axum/blob/main/axum/CHANGELOG.md

おわりに

Rustはシステムプログラミング言語なせいかこういうHow to記事が少なく、私も最初は苦労しました。
役に立つかどうか分かりませんが、好き嫌いで話すより建設的だと思ったので書き記しておくことにします。

Discussion