如何在离线环境下使用Cargo构建项目?

24

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

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

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

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

5个回答

23

从Rust 1.37开始,Cargo内置的vendor命令可以用于下载和打包您的箱体依赖项:

  1. 首先运行cargo vendor。这将在您的 crate 根目录下设置一个名为 vendor 的新目录。然后它将下载所有必需的依赖项并将它们存储在这个新目录中。

  2. 在完成下载依赖项之后,它将打印一组指令,您需要遵循这些指令。当前这些指令告诉您要复制几行代码到.cargo/config.toml文件中。请注意,config.toml相对于crate根目录,而不是您的主目录。

如果您完成了这两个步骤,那么您的板条箱将在其依赖方面完全自包含。您可以将此方法与 Rust 的离线安装程序相结合,以完全脱机构建 Rust 程序。

5

针对 Rust 1.37+,请查看:https://dev59.com/_FwY5IYBdhLWcg3wup5c#65254702


简单来说,在版本 1.37(不包括)之前,这是很复杂的。

较为详细的回答是,cargo将尝试连接github,以检查Cargo.toml文件所引用的crate索引。

我推荐您查看cargo-vendor原型解决此问题(由Rust工具子团队成员aturon提供),或者您可以了解一些人如何创建镜像以避免依赖互联网。

有人正在研究不需要互联网的Rust build,但目前没有官方解决方案。


打败我 7 秒。 :P 还应该补充一下,提问者的实际问题是索引保存在 GitHub 存储库中;仅仅镜像软件包本身是不够的。 - DK.
@DK:这不已经包含在我的第二段中了吗?如果您认为不够明显,我欢迎任何编辑以使其更加清晰。 - Matthieu M.
非常感谢。现在,这真的很复杂~~~ - 习明昊
1
@MatthieuM。嗯,你提到了crates.io,但那只是实际包文件存储的地方,而不是索引。因此,即使镜像所有crates.io也不足够。 - DK.
这个回答已经过时了:自 Rust 1.37 版本开始,Cargo 可以自行供应外部依赖项,而无需安装任何其他工具。更多细节请参见我的回答 - Tenders McChiken
1
@TendersMcChiken 谢谢;我添加了“重定向”通知,现在我们只需要你的答案得到投票支持,这样它就会上浮,或者被提问者接受。 - Matthieu M.

4

请查看romt - Rust 离线镜像工具

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

  • 镜像 Rust 生态系统组件:
    • 工具链(Rustc、Cargo、库等)
    • Rustup(工具链复用器)
    • Crates.io(社区提供的 Crates)
  • 渐进式组件下载。
  • 将渐进式组件传输到离线网络中。
  • 在离线情况下(离线计算机、断开的网络)提供组件服务。

1
尝试使用panamax(https://github.com/panamax-rs/panamax)设置离线货物注册表。 该过程简单明了,并有详细的文档记录。最大的优势是您可以设置一个仅包含项目中使用的crate的注册表(这对于构建可复制性很有好处)。此外,您还可以像在线一样使用构建过程/脚本。

0

我可以通过添加这个.cargo/config文件到我的项目中来替换官方的crates.io注册表使用(在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 进行下载

cargo build 现在会打印 Updating 'c:\github\crates.io-index.git' index 而不是 Updating crates.io index


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接