【发布时间】:2021-04-26 03:07:02
【问题描述】:
有没有办法告诉Cargo 安装和构建我的所有依赖项,但不尝试构建我的应用程序?
我认为cargo install 会这样做,但实际上它也一直用于构建我的应用程序。我想达到一个状态,cargo build 会发现所有可以使用的依赖项,但不接触 /src 目录。
我真正想要实现的目标:
我正在尝试为 Rust 应用程序构建 Docker 映像,我想在其中执行以下步骤:
构建时间(docker build .):
- 导入安装了 rust 工具的 docker 映像
- 添加我的 Cargo.toml 和 Cargo.lock 文件
- 下载并构建所有依赖项
- 将我的源目录添加到图像中
- 构建我的源代码
运行时间(docker run ...):
- 运行应用程序
我尝试了以下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,因为当我更改自己的代码时,这会使缓存的图像无效。
【问题讨论】:
-
这是一个有趣的要求!您是否试图通过提供仅列出
extern crate的“假”lib.rs来破解自己的方式?它可能会创建一个target存储库,但您始终可以在执行cargo build后删除它。 -
这是一个有趣的想法! ;) 我回家后会试试的。我对 Rust 完全陌生,所以我不太了解内部工作原理或正确构建某些东西所需的内容 - 到目前为止,我的方法一直是反复试验......
-
我自己在 Cargo 方面没有太多经验,所以这更像是一种试探性的解决方法。据我所知,您想要的命令已经可用。
-
cargo vendor在这里有用吗? -
@ChrisEmerson:在努力让
cargo vendor在我的映像上正确安装和运行之后,我注意到这些deps 已下载,但未构建。我正在研究是否可以让它们也进行预编译...
标签: rust rust-cargo