Cargo 是否可以在不构建应用程序的情况下下载并构建依赖项?

2024-03-09

有没有办法告诉Cargo http://doc.crates.io/guide.html安装和构建我的所有依赖项,但不尝试构建我的应用程序?

我想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 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(使用前将#替换为@)

Cargo 是否可以在不构建应用程序的情况下下载并构建依赖项? 的相关文章

随机推荐

  • 无法解析类型“uint32_t”

    我正在 Eclipse 3 8 1 CDT 中开发 C 程序 我在 Debian 8 上使用 gcc 编译器 我还使用一个用 C 编写的名为 opendnp3 的开源库 它需要uint32 t来解析 因为它是多个方法调用和构造函数中的参数
  • 在执行过程中停止 Rhino 引擎

    Rhino 引擎是否有一个 api 可以停止执行 脚本fie在中间 例如 我有一个脚本文件 其中 有一个无限循环 怎样才能中途停止执行呢 当然 我可以停止启动Rhino引擎的jvm 执行脚本 但我不想因为这个原因终止整个 jvm 会话 因为
  • Javascript 排序以匹配 SQL Server 排序

    任何人都可以向我指出 JavaScript 中的排序算法 该算法的排序方式与 SQL Server 的排序方式相同 对于 nvarchar unicode 列 作为参考 我之前关于此行为的问题可以在这里找到 SQL Server 2008
  • 像 RStudio 这样的 Python 工作流程?

    我使用 Python 作为主要编程语言 有时会切换到 R 来执行快速数据分析任务 因为它具有用于统计编程目的的庞大库 尽管pandas http pandas pydata org 对于 python 来说太棒了 我猜大多数 R 用户都会选
  • 无法在 Android 模拟器中模拟位置数据

    我正在尝试测试我的应用程序 它使用模拟器使用地理定位 介绍了几种方法here https stackoverflow com questions 2279647 how to emulate gps location in the andr
  • 如何在数字数组中找到最佳匹配元素?

    我需要帮助解决一些看似简单但让我困惑的事情 尝试编写一些模糊匹配方法来处理根据需要计算的值与选择列表中实际可用的值之间的格式差异 价值 期权执行价格 始终是计算出的 Float 例如85 0 or Int 该数组包含字符串形式的数字 无论是
  • Jackson deearlization:根上有两个键。我如何打开其中一个并忽略另一个?

    使用杰克逊 2 x json 响应如下所示 flag true important id 123 email email protected cdn cgi l email protection flag 键不提供任何有用的信息 我想忽略
  • 为什么 C++ 编译器在创建机器代码之前将源代码翻译成汇编? [复制]

    这个问题在这里已经有答案了 我开始学习C 了解到编译器通过编译将源代码从程序变成机器代码 然而 我了解到 C 编译器实际上将源代码转换为汇编代码 作为将汇编代码转换为机器代码之前的中间步骤 这一步的目的是什么 他们为什么不直接将其翻译成机器
  • Reactjs/Apollo/AppSync 突变触发两次

    我遇到了 React Apollo AppSync 的问题 突变触发了两次 或多次 我有一个 React 应用程序 它有一个由通常的 UI 按钮 onClick 触发的更新突变
  • VS2012 发布网站 dll 而不是 cs 文件

    我有一个想要发布的简单 ASP NET 项目 我右键单击该项目并按 发布网站 但这会将我的所有 cs 文件生成到所选文件夹中 之前我一直在 bin 文件夹中获取 dll 文件而不是 cs 文件 我究竟做错了什么 问题可能出在发布设置中 请检
  • Javascript:检测 OS X“自然滚动”设置

    我面临一个问题 对于我正在做的项目 我正在检测滚轮位置 并根据该位置是否导航到下一张幻灯片 然而 一个问题是 一些 Mac 用户使用 自然滚动 反转页面上的滚动 这意味着 对于这些用户 我应该使用另一个方向的滚动作为触发器 我的问题是 有没
  • 在 VB.NET 中将 ArrayList 数据绑定到 ListBox?

    我在 VB NET 工作 我有一个名为 Invoices 的 ArrayList 其中填充了 Invoice 类的对象 我想将其数据绑定到 ListBox 以便随着 ArrayList 的内容更新并更改 ListBox 的更新 我已经在 I
  • 如何使用shell脚本访问mysql数据库?

    有没有办法使用 shell 脚本访问 MySQL 数据库 想要对多个表进行一些选择和插入 如果您能提供一些示例代码 那就太好了 因为我是脚本编写新手 这个链接似乎有你想要的信息 http www cyberciti biz faq usin
  • Android SQLite 中的多线程怎么样?

    在我的应用程序中 我必须实现一些 UI 和同步服务 它在后台运行并更新数据 同步服务并不是很简单 它使用了多线程 所以 这是我的故事 当我开始开发这个应用程序时 我对sqlite一无所知 所以我只是没有在Java中使用任何线程同步 结果 我
  • Qt 我可以在构造函数中将信号/槽连接到自身吗?

    编辑 与信号 插槽 连接无关 问题是构造函数调用构造函数 可能有更好的方法来做到这一点 我有兴趣听到这些 我有从 QLabel 派生的 MyClass 我想在信号中传递更多有关派生类的数据 而不是基本信号的数据 因此 我创建了一个插槽来拦截
  • 元音计数顺序

    这不是一个家庭作业问题 而是一个考试准备问题 我应该定义一个函数syllables word 计算音节数 一句话如下 元音的最大序列是一个音节 最终e在一个单词中不是一个音节 或者它是元音序列的一部分 的 我不必处理任何特殊情况 例如最终的
  • SQL - 将每个单词的第一个字母大写

    我知道这个线程到处都存在 但是 这是一个略有不同的情况 在我公司使用的套件中 我对 SQL 的访问权限有限 无法运行具有函数等的复杂代码 我有一个 SQL 查询 将多个列上的数据编译为一列 并使用 group by 子句来消除多重性 然而
  • TSQL RIGHT 字符串函数不起作用

    我无法理解为什么正确的功能不适合我 我试图在这里容纳尽可能多的输出 如果阅读起来令人困惑 我深表歉意 DECLARE Nbr VARCHAR 27 SELECT Nbr xmz nbr FROM xml temp AS xmz SELECT
  • 要显示此页面,Firefox 必须发送将重复之前执行的任何操作(例如搜索或订单确认)的信息

    嘿 我收到了 Firefox 的确认 To display this page Firefox must send information that will repeat any action such as a search or or
  • Cargo 是否可以在不构建应用程序的情况下下载并构建依赖项?

    有没有办法告诉Cargo http doc crates io guide html安装和构建我的所有依赖项 但不尝试构建我的应用程序 我想cargo install会这样做 但实际上它也一直用于构建我的应用程序 我想要达到一个状态carg