rust - Cargo 可以在不构建应用程序的情况下下载和构建依赖项吗?

标签 rust rust-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 直到 安装依赖项,因为这会在我更改自己的代码时使缓存的图像无效。

最佳答案

据我所知,Cargo 不支持仅构建依赖项。有 an open issue for it .如果您可以向 Cargo 提交一些东西来完成它,或者创建一个第三方 Cargo 插件,我不会感到惊讶。我也想要 cargo doc 的这个功能,当我自己的代码太破无法编译时 ;-)

然而,Rust playground我坚持认为确实可以实现您的最终目标。有一个 base Docker containerCargo.toml 中安装 Rustup 和副本 Playground 可用的所有 crate 。 The build steps create a blank project (with a dummy src/lib.rs), then calls cargo build and cargo build --release to compile the crates :

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 目录中,所有构建的 crate 都存储在应用程序 target/{debug,release} 中目录。

稍后,真正的源文件被复制到容器中,cargo build/cargo run 可以使用现在编译的箱子再次执行。

如果您正在构建一个可执行项目,您也想复制 Cargo.lock。

关于rust - Cargo 可以在不构建应用程序的情况下下载和构建依赖项吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130132/

相关文章:

rust - 是否有替代方法或方法让 Rc<RefCell<X>> 限制 X 的可变性?

rust - 如何为 Cargo 中的子依赖项指定功能?

rust - 为什么当它是简单格式时,我会得到 "error: invalid channel name ' [工具链 ]'"的依赖项?

hashmap - 为什么我需要取消引用 HashMap 的键两次?

rust - 如何获得 C++ 初始化列表的等价物

rust - 运行特定的.rs文件

rust - 在嵌套循环中从 BufReader 读取时出错

rust - 错误 : can't find crate

rust - 如何在 Rust 中使用 BigInt 和 Bigint 生成一系列值?

arrays - 如何将数组强制转换为匹配臂中的切片?