Cargo はアプリケーションをビルドせずに依存関係をダウンロードしてビルドできますか? 質問する

Cargo はアプリケーションをビルドせずに依存関係をダウンロードしてビルドできますか? 質問する

見分ける方法はあるか貨物すべての依存関係をインストールしてビルドしますが、アプリケーションのビルドは試行しませんか?

そうするつもりcargo installでしたが、実際にはアプリのビルドまですべて実行されてしまいます。ディレクトリcargo buildに触れることなく、すべての依存関係が使用できる状態に到達したいのです/src


私が本当に達成しようとしていること:

Rust アプリケーション用の Docker イメージを構築しようとしています。次の手順を実行したいと思います。

ビルド時間(docker build .):

  1. RustツールがインストールされたDockerイメージをインポートする
  2. Cargo.tomlとCargo.lockファイルを追加する
  3. すべての依存関係をダウンロードしてビルドする
  4. ソースディレクトリをイメージに追加する
  5. ソースコードをビルドする

実行時間(docker run ...):

  1. アプリケーションを実行する

以下のことを試しましたDockerfileが、示された手順でアプリケーションもビルドされます (もちろん、ソース ディレクトリがまだ存在しないため失敗します)。

FROM jimmycuadra/rust

ADD Cargo.toml /source
ADD Cargo.lock /source

RUN cargo install # <-- failure here

ADD src /source/src
RUN cargo build

ENTRYPOINT cargo run

依存関係のインストール手順とアプリケーションの実際のビルドを分離したい理由は、依存関係を変更しない場合、Dockerがすべての依存関係がすでにインストールされビルドされたキャッシュされたイメージを使用できるようにするためです。したがってADD /src /source/src依存関係をインストールしないと、独自のコードを変更したときにキャッシュされたイメージが無効になります。

ベストアンサー1

私の知る限り、Cargoには依存関係だけをビルドするためのネイティブサポートはありません。それは未解決の問題である. ただし、Cargo に何かを送信してこれを実現したり、サードパーティの Cargo アドオンを作成したりできるとしても驚きではありません。cargo doc自分のコードが壊れていてコンパイルできないときにも、この機能が欲しかったのです ;-)

しかし錆びた遊び場私が主張するところによると、最終目標は達成される。ベースDockerコンテナRustupをインストールしてコピーするCargo.toml遊び場に利用できるすべての木箱付き。ビルド手順では、空のプロジェクト(ダミーsrc/lib.rs)を作成し、 を呼び出してcargo buildクレートcargo build --releaseをコンパイルします。:

RUN cd / && \
    cargo new playground
WORKDIR /playground

ADD Cargo.toml /playground/Cargo.toml
RUN cargo build
RUN cargo build --release
RUN rm src/*.rs

ダウンロードされたすべてのクレートは Docker イメージの$HOME/.cargoディレクトリに保存され、ビルドされたすべてのクレートはアプリケーションtarget/{debug,release}ディレクトリに保存されます。

その後、実際のソース ファイルがコンテナーにコピーされ、コンパイルされたクレートを使用して再度実行できるようになりますcargo buildcargo run

実行可能なプロジェクトをビルドする場合は、Cargo.lock もコピーする必要があります。

おすすめ記事