【问题标题】:How to build a project using Cargo in an offline environment?如何在离线环境下使用 Cargo 构建项目?
【发布时间】:2021-07-01 17:06:22
【问题描述】:

我有一台装有 OS X 系统的笔记本电脑,可以访问互联网,还有一台 Linux 服务器,由于某些安全原因,它无法访问互联网。

我想构建一个依赖 Linux 服务器的 Rust 项目。由于Linux服务器无法上网,我在OSX笔记本上运行cargo build命令,将依赖源文件下载到.cargo目录,然后将这些文件复制到Linux服务器,放到/root/.cargo目录下。

我使文件结构相同,但是当我在 Linux 服务器上运行 cargo build 时,它仍然尝试连接到 this 网站并且构建失败。 cargo build 命令总是尝试连接互联网,尽管 dep 源文件已经在 .cargo 目录中。

如何在离线环境中构建具有依赖关系的 Rust 项目?为什么复制依赖的源文件不起作用?

【问题讨论】:

    标签: linux macos rust


    【解决方案1】:

    好消息!从 Rust 1.37 开始,您可以使用 Cargo 自己的 vendor command 下载并捆绑您的 crate 的依赖项到 crate 本身:

    1. 首先,运行cargo vendor。这将在 crate 的根目录中设置一个名为 vendor 的新目录。然后它将从 crates.io 和 git 下载依赖项,并将它们存储在这个新目录中。

    2. cargo vendor 完成所有所需依赖项的下载后,它将打印一组您需要遵循的说明。在撰写本文时,您只需将几行复制到.cargo/config.toml。请注意,config.toml 是相对于 crate 的根目录,而不是您主目录中的根目录。

    一旦完成,就依赖关系而言,您的 crate 将完全独立。您可以将此方法与 Rust 的 offline installers 结合使用,以完全离线构建 Rust 程序。

    【讨论】:

      【解决方案2】:

      对于 Rust 1.37+,请参阅: https://stackoverflow.com/a/65254702/147192


      简短的回答是:高达 1.37(不包括在内),这很复杂。

      长答案是cargo 将尝试连接到github 以检查Cargo.toml 文件引用的板条箱的索引。

      我建议你检查 cargo-vendor 原型来解决这个问题(由 aturon,Rust 工具子团队的成员),否则你可以看看一些人如何 created a mirror 为 crates.io 以避免对互联网的依赖。

      Rust 构建需要不需要互联网,并且人们正在研究它,但是目前还没有幸运的解决方案。

      【讨论】:

      • 比我快 7 秒。 :P 还应该补充一点,提问者的实际问题是 index 保存在 GitHub 存储库中;仅仅镜像包本身是不够的。
      • @DK.: 这不是已经包含在我的第二段中了吗?如果您认为这不够明显,我欢迎进行任何编辑以使其更清晰。
      • 非常感谢。现在真的好复杂~~~
      • @MatthieuM。好吧,您提到了crates.io,但这只是实际包文件的存储位置,而不是索引。因此,即使镜像crates.io全部 也是不够的。
      • @TendersMcChiken 谢谢;我添加了“重定向”通知,现在我们只是要对您的回答进行投票,以便它冒泡,或者让 OP 接受它。
      【解决方案3】:

      查看新发布的romt - Rust Offline Mirror Tool

      Romt(Rust 离线镜像工具)有助于在离线环境中使用 Rust 编程语言。提供了以下说明和工具:

      • Rust 生态系统工件的镜像:
        • 工具链(Rustc、Cargo、库等)
        • Rustup(工具链多路复用器)
        • Crates.io(社区提供的 Crates)
      • 增量工件下载。
      • 增量工件传输到离线网络。
      • 在离线环境(离线计算机、断开网络)中提供工件。

      【讨论】:

        【解决方案4】:

        我可以通过添加这个来替换官方 crates.io 注册表使用 我项目中的 .cargo/config 文件(在 windows 下 %USERPROFILE%\.cargo\config 似乎被忽略了):

        [source]
        
        [source.mirror]
        registry = "http://localhost:8185/auser/crates.io-index.git"
        
        [source.crates-io]
        replace-with = "mirror"
        

        也可以使用基于文件的 git 注册表克隆:

        registry = "file://c:/github/crates.io-index.git"
        

        使用 git clone --bare 或 --mirror 下载

        货物建造现在打印 Updating 'c:\github\crates.io-index.git' index 而不是Updating crates.io index

        【讨论】:

          【解决方案5】:

          我可以通过添加这个来替换官方 crates.io 注册表使用 .cargo/config 文件在我的项目中(或在 $CARGO_HOME%\.cargo 下):

          [source]
          
          [source.mirror]
          registry = "http://localhost:8185/auser/crates.io-index.git"
          
          [source.crates-io]
          replace-with = "mirror"
          

          也可以使用基于文件的 git 注册表克隆:

          registry = "file://c:/github/crates.io-index.git"
          

          使用 git clone --bare 或 --mirror 下载

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-28
            • 2015-08-10
            • 1970-01-01
            • 1970-01-01
            • 2019-07-14
            • 1970-01-01
            • 2021-08-06
            相关资源
            最近更新 更多