プログラミング
バッテリーパック:クレートについて語りましょう
Battery packs: Let's talk about crates, baby (smallcultfollowing.com)
要約
この記事では、Rustの「バッテリーパック」という新しいアイデアを紹介しています。これは、特定のテーマ(例:CLIツール作成、バックエンドサービス開発)に基づいてキュレーションされたクレート(ライブラリ)のセットで、新規採用者がクレート選定にかかる時間を短縮することを目的としています。誰でも独自のバッテリーパックを作成・公開でき、メンテナンス支援や相互運用性の向上にも貢献すると期待されています。
全文翻訳
この記事では、私が考えている「バッテリーパック」というアイデアについて説明します。
バッテリーパックは、共通のテーマを中心にキュレーションされたクレートのセットです。
例えば、優れたCLIを作成するために必要なものがすべて揃ったCLIバッテリーパック、バックエンドWebサービスを作成するための意見が反映されたパック、そして組み込み開発用(Embedded Working GroupのAwesome Rustリポジトリに基づく)のパックがあります。
また、Rustでエラーを処理する方法を示すエラー処理バッテリーパックのような、より小規模なものもあります。
しかし、これはほんの始まりに過ぎません。バッテリーパック設計の重要な部分は、誰でも作成できるということです。
バッテリーパックは、新しいRust採用者からよく聞くことの一つに対処するために作られています。
crates.ioで利用可能な高品質なクレートの豊富さは皆に愛されています。そして、代替案を調査・比較するのに多くの時間を費やすことを皆嫌います。
バッテリーパックは、良いデフォルトの選択肢として機能します。そして、それらはあなたをロックしません。
本質的に、それらは単におすすめクレートのリストなので、代替案を見つけた場合はいつでも何かを交換できます。
今日、バッテリーパックツールのプロトタイプが動作しているので、興味があれば試すことができます。
ただ cargo install cargo-bp を実行し、いくつかのコマンドを試してみてください。
例えば、
> cargo bp list
は、crates.ioの検索に基づいて利用可能なバッテリーパックのセットを表示します(後述しますが、バッテリーパック自体はクレートとしてパッケージ化・配布されますが、直接依存するものではありません)。
そして cargo bp add は、バッテリーパックからバッテリーをクレートに追加します。例えば、
> cargo bp add cli
とすると、一般的なCLIライブラリを選択して追加できます。
より複雑なデモを見たい場合は、Awesome Embedded Rustリポジトリから派生した cargo bp add embedded を試してみてください。
あなたと私について語りましょう
バッテリーパックの重要なアイデアの一つは、誰でも公開できるということです。
それらは X-battery-pack という名前のクレートに過ぎません。そのクレートの依存関係があなたの推奨事項です。
フィーチャーは、頻繁に一緒に使用されるクレートの共通セットの指定です。
例はテンプレートです。
そして、その他も同様です。
誰でもバッテリーパックを作成できるようにすることは、以前の「Rustのための拡張標準ライブラリ」というアイデアとは対照的であり、Rustのユニークな課題のいくつかに対応することを意図しています。
一つには、特定の要件に合わせて調整されたバッテリーパックを公開できます。
例えば、CLIおよびバックエンドサービスバッテリーパックは「典型的なコンピューター」をターゲットにしています。
しかし、Rust組み込みワーキンググループが、no-stdおよびバイナリサイズ最適化に焦点を当てたライブラリを含むバッテリーパックを公開することを想像できます。
オープンエンドであることは、「誰が決めるのか?」という問題にも対応します。
私の考えでは、どのライブラリを使用すべきかを推奨するのに最適な人々は、あなたと同じようなシステムを構築している他の人々です。
だからこそ、例えば組み込みワーキンググループが組み込みバッテリーパックを公開すると言及したのです。彼らは明らかにその分野をよく知っている人々だと私は思います。
しかし、組み込み分野内でもさらに小さなグループがあり、時にはより狭い範囲を対象にすることが理にかなっていると想像できます。
例えば、embassyとその関連エコシステムをターゲットにしたバッテリーパックでしょうか?不明です。
バッテリーパックの作成
バッテリーパックを作成したい場合、どうすればよいでしょうか?
一つの答えは、新しいクレートを作成することです。
しかし、より良いアプローチは、「battery-pack battery pack」を使用することです。これはテンプレートをバンドルしています。
cargo bp new battery-pack
これにより、作成したいバッテリーパックの名前やその他のいくつかの項目を入力するように求められ、クレートが作成されます。
その後、cargo add dependencies を使用して推奨したいライブラリを表し、公開するだけです。
「バッテリー」は依存関係以上のものです
プロジェクトに追加できる「バッテリー」は、常に依存関係とは限りません。
それらは「レシピ」やテンプレートであることもあります。
例えば、CIバッテリーパックは、あなたが常に欲しかったが設定するのを面倒に感じていたような「超クールな」GitHubアクションでプロジェクトを設定できます。
それを使用するには、インストールするテンプレートを1つ以上選択します。
cargo bp add ci
私は、このような「クレートを改善するためのアクション」が豊かな情報源になると予想しています。
現在、私たちはminijinjaに基づいた比較的軽量なテンプレートシステムを使用していますが、これを拡張する必要があると考えています。
構造を与える
バッテリーパックは、依存関係/フィーチャー/テンプレートのフラットなリスト以上のものをサポートしています。
依存関係やフィーチャーをカテゴリにグループ化し、各カテゴリについて、「最大1つ選択」または「いくつでも選択」を区別できます。
楽しい例として、Awesome Embedded Rustリポジトリから派生した cargo bp add embedded を試してみてください。
それを実行すると、次のようなものが表示されます。これは、選択肢をテーマ別にグループ化し、「並行処理フレームワーク」のような領域では、1つ選択する必要があることを明確にしています。
────────────────────────────────────────────────────────────────── ▼ 並行処理フレームワーク(最大1つ選択) > ○ ✦ embassy [embassy-executor, embassy-sync, embassy-time] ○ ✦ rtic [cortex-m, rtic] RTIC — interrupt-driven real-time ▼ ディスプレイ&グラフィックス(いくつでも選択) [ ] ✦ display-ssd1306 [embedded-graphics, ssd1306] SSD1306 [ ] ✦ display-st7789 [embedded-graphics, st7789] ST7789 col ▼ 人気のあるドライバー(いくつでも選択) [ ] ✦ display-ssd1306 [embedded-graphics, ssd1306] SSD1306 [ ] ✦ display-st7789 [embedded-graphics, st7789] ST7789 col [ ] ✦ sensor-bme280 [bme280] BME280 温度/湿度/気圧 [ ] ✦ sensor-lis3dh [lis3dh] LIS3DH 3軸加速度計 (I [ ] ✦ usb-device [usb-device, usbd-serial] USBデバイススタック ▼ ハードウェア抽象化レイヤー(最大1つ選択) ○ ✦ atsamd [atsamd-hal, cortex-m-rt, critical-section-impl, co ○ ✦ esp32 [embedded-hal, esp-hal] ESP32 (Xtensa, WiFi + BT, ○ ✦ esp32c3 [embedded-hal, esp-hal] ESP32-C3 (RISC-V, WiFi ○ ✦ esp32s3 [embedded-hal, esp-hal] ESP32-S3 (Xtensa, WiFi ○ ✦ nrf52832 [cortex-m-rt, critical-section-impl, cortex-m, em ○ ✦ nrf52840 [cortex-m-rt, critical-section-impl, cortex-m, em ○ ✦ nrf9160 [cortex-m-rt, critical-section-impl, cortex-m, emb ○ ✦ rp2040 [cortex-m-rt, critical-section-impl, cortex-m, embe ○ ✦ stm32f0 [cortex-m-rt, critical-section-impl, cortex-m, emb embedded-battery-pack v0.1.0 ↑↓/jk ナビゲート | Space トグル | ←/→
良いことと悪いこと…
なぜ私がバッテリーパックにそれほど熱心なのか?
それは主に、多くの潜在的または最近のRust採用者がクレートを選ぶことを課題だと話しているのを耳にしたからです。
しかし、他の問題にも役立つと私は感じています。
私が本当に見たいのは、Rust Commercial Networkのワーキンググループが協力してバッテリーパックと推奨事項を公開することです。
これらは、彼らが実際に使用している依存関係をカバーするでしょう。
メンテナーのサポート
RCN認定バッテリーパックを設けたい理由の一つは、RCNメンバーにそれらのクレートのメンテナンスに資金を提供するよう促すための自然な焦点となるからです。
RCN内で販売される各スポンサー付きバッテリーパックには、関連する「エコシステムファンド」があると想像しています。
企業や個人は、早期パッチ、セキュリティ開示、その他の特典にアクセスするために、このファンドをスポンサーすることができます。
資金は、それらのクレートのメンテナーをサポートし、不足している機能の実装などに使用されます。
相互運用性の育成
バッテリーパックのもう一つの付加価値は、相互運用性への取り組みを推進できることです。
標準化について話し始めるとすぐに、標準化が難しい場所がいくつかあることに気づくでしょう。
例えば、ネットワークサービスワーキンググループ内での初期の会話では(驚くことではありませんが)、ほとんどの人がtokioを使用している一方で、いくつかの大企業が内部で独自のランタイムを使用していることがすぐに特定されました。
「非同期ランタイム相互運用性」の必要性がニュースではないようなものです。
しかし現在、すべてのクレートが事実上、それを機能させるために独自の小さなトレイトセットを実装することになっています。
スポンサー付きバッテリーパックは、そのようなもののためのニュートラルなホームを提供する可能性を提供します。
…そして起こりうる悪いこと
人々が使用するリスクがいくつかあります