有没有办法告诉Cargo http://doc.crates.io/guide.html安装和构建我的所有依赖项,但不尝试构建我的应用程序?
我想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
until after安装依赖项,因为当我更改自己的代码时,这会使缓存映像无效。
据我所知,Cargo 中没有原生支持构建依赖项。有一个悬而未决的问题 https://github.com/rust-lang/cargo/issues/2644。如果您可以向 Cargo 提交一些内容来完成它,或者创建一个第三方 Cargo 插件,我不会感到惊讶。我一直想要这个功能cargo doc
同样,当我自己的代码太糟糕而无法编译时;-)
但是,那铁锈游乐场 https://play.rust-lang.org/我认为这确实实现了你的最终目标。有一个基础 Docker 容器 https://github.com/integer32llc/rust-playground/blob/master/compiler/base/Dockerfile安装 Rustup 并复制到Cargo.toml https://github.com/integer32llc/rust-playground/blob/master/compiler/base/Cargo.toml游乐场上有所有可用的板条箱。构建步骤创建一个空白项目(带有一个虚拟项目)src/lib.rs),然后调用cargo build and cargo build --release编译箱子 https://github.com/integer32llc/rust-playground/blob/dea331e1de3e22eb6fd6f6a1556df6c874700607/compiler/base/Dockerfile#L32-L39:
RUN cd / && \
cargo new playground
WORKDIR /playground
ADD Cargo.toml /playground/Cargo.toml
RUN cargo build
RUN cargo build --release
RUN rm src/*.rs
所有下载的 crate 都存储在 Docker 镜像中$HOME/.cargo
目录和所有构建的板条箱都存储在应用程序中target/{debug,release}
目录。
随后,将真正的源文件复制到容器中并cargo build
/ cargo run
可以使用现在编译的 crates 再次执行。
如果您正在构建一个可执行项目,您还需要复制 Cargo.lock。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)