Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Rust、何もわからない... #2

Rust、何もわからない... #2

「Rust、何もわからない... 」

チュートリアルを読んで完全に理解したつもりでも、実務で使ってみると次々とこれはどうすればいいのか、という場面が出てきます。本イベントは実務で得た知見を共有する中級者向けのイベントです。
今回は、ゲストにキャディ株式会社 Tech Leadのvaaaaanquishさんに来ていただき、CADDiの事例も共有していただきます。

日時:5/19(木) 19:00~20:00
イベントハッシュタグ:#Rust何もわからない

estie | エスティ

May 24, 2022
Tweet

More Decks by estie | エスティ

Other Decks in Programming

Transcript

  1. ディレクトリ構成の変化 backend/ ├── api ├── auth0 ├── datadog ├── middleware

    │ └── src │ ├── auth │ ├── datadog ├── s3 ├── sendgrid ├── sql ├── src ├── tests ├── Cargo.lock └── Cargo.toml backend/ ├── src │ ├── api │ ├── datadog │ ├── db │ ├── middleware │ │ ├── auth │ │ └── datadog │ ├── s3 │ └── service ├── tests ├── Cargo.lock └── Cargo.toml 初期の頃の構成 現在の構成
  2. Rustプロジェクトの基本構成 app/ ├── src │ ├── module1 │ ├── module2

    │ │ ├── sub_module1 │ │ └── sub_module2 │ └── module3 ├── Cargo.lock └── Cargo.toml • プロジェクトのルートには ◦ src/ ◦ Cargo.toml ◦ Cargo.lock • 各モジュールは src/ の中に入っている
  3. Rustプロジェクトの基本構成 module crate sub_module pub struct Struct1; pub(crate) struct Struct2;

    pub(super) struct Struct3; ライブラリではなくアプリを作るとき、 pub かどうかはそんなに重要ではない …
  4. Rustプロジェクトの基本構成 module crate (SQLなどの1機能のモジュール) sub_module pub struct Struct1; pub(crate) struct

    Struct2; 機能単位の中では全開・外には出さない 外に見せるインターフェイスとなる
  5. app/ ├── Cargo.lock ├── Cargo.toml └── src ├── lib.rs ├──

    module1 │ └── sub_module.rs └── module1.rs app/ ├── Cargo.lock ├── Cargo.toml ├── module1 │ ├── Cargo.toml │ └── src │ ├── sub_module.rs │ └── lib.rs └── src └── lib.rs
  6. ルートの Cargo.toml を設定 [package] name = "application" version = "0.1.0"

    edition = "2021" [dependencies] [workspace] members = ["module1"]
  7. Rust プロジェクトのdocker build事情 • Dockerでキャッシュを効かせるのが大変! • まず Cargo.toml と Cargo.lock

    だけコピーする • ビルドを走らせ、依存パッケージのコンパイルをする ———————— ここまでキャッシュされる ——————— • コードをコピーして再度ビルドする ◦ アプリ部分のみコンパイルして、最後にリンク
  8. app/ ├── Cargo.lock ├── Cargo.toml └── src ├── lib.rs ├──

    module1 │ └── sub_module.rs └── module1.rs app/ ├── Cargo.lock ├── Cargo.toml ├── module1 │ ├── Cargo.toml │ └── src │ ├── sub_module.rs │ └── lib.rs └── src └── lib.rs
  9. app/ ├── Cargo.lock ├── Cargo.toml └── src ├── lib.rs ├──

    module1 │ └── sub_module.rs └── module1.rs app/ ├── Cargo.lock ├── Cargo.toml ├── module1 │ └── Cargo.toml ├── module2 │ └── Cargo.toml ├── module3 │ └── Cargo.toml └── src └── lib.rs
  10. app/ ├── Cargo.lock ├── Cargo.toml └── src ├── lib.rs ├──

    module1 │ └── sub_module.rs └── module1.rs app/ ├── Cargo.lock ├── Cargo.toml ├── module1 │ └── Cargo.toml ├── module2 │ └── Cargo.toml ├── module3 │ └── Cargo.toml ├── module4 │ └── Cargo.toml ├── module5 │ └── Cargo.toml Cargo.toml 多すぎ!
  11. Rust プロジェクトのdocker build事情 • まず Cargo.toml と Cargo.lock だけコピーする •

    ビルドを走らせ、依存パッケージのコンパイルをする ———————— ここまでキャッシュされる ——————— • コードをコピーして再度ビルドする ◦ アプリ部分のみコンパイルして、最後にリンク
  12. Rust プロジェクトのdocker build事情 • まず Cargo.toml と Cargo.lock だけコピーする •

    ビルドを走らせ、依存パッケージのコンパイルをする ———————— ここまでキャッシュされる ——————— • コードをコピーして再度ビルドする ◦ アプリ部分のみコンパイルして、最後にリンク Cargo.tomlが多すぎて 最高のDockerfileが作れない!
  13. RUN mkdir -p s3/src RUN touch s3/src/lib.rs COPY ./s3/Cargo.toml ./s3/

    RUN mkdir -p api/src RUN touch api/src/lib.rs COPY ./api/Cargo.toml ./api/ RUN mkdir -p pidan/src RUN touch pidan/src/lib.rs COPY ./pidan/Cargo.toml ./pidan/ RUN mkdir -p datadog/src RUN touch datadog/src/lib.rs COPY ./datadog/Cargo.toml ./datadog/ RUN mkdir -p sendgrid/src RUN touch sendgrid/src/lib.rs COPY ./sendgrid/Cargo.toml ./sendgrid/ RUN mkdir -p firehose/src RUN touch firehose/src/lib.rs COPY ./firehose/Cargo.toml ./firehose/ RUN mkdir -p sql/src RUN touch sql/src/lib.rs COPY ./sql/Cargo.toml ./sql/ COPY ./Cargo.lock . RUN cargo build --release RUN rm -rf ./src COPY ./src ./src RUN touch src/lib.rs RUN rm -rf ./s3 COPY ./s3 ./s3 RUN touch s3/src/lib.rs RUN rm -rf ./api
  14. # cargo-chef の公式イメージを使う FROM lukemathwalker/cargo-chef:latest-rust-1.60.0 AS chef WORKDIR /app #

    依存関係を整理したファイル recipe.json を出力する。 FROM chef AS planner COPY . . RUN cargo chef prepare --recipe-path recipe.json FROM chef AS builder # recipe.json に基づいて dependencies をビルドする。recipe.json に変更がなければここまでキャッシュされている。 COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json # アプリケーションをビルドする COPY . . RUN cargo build --release # プロダクション用の Docker イメージをビルドする FROM rust:1.60.0 AS production ...
  15. まとめ • Cargo Workspace 最高! • cargo-chef 最高! ◦ Workspace

    を使ったプロジェクトでも Dockerfile がシュッとする