Rust离线安装

前言:有的时候我们的开发环境不允许我们联网,那么就需要用到Rust的离线安装;

一、在官网下载那里有离线安装的msi文件(大概170m),记得选择GNU版本的(当然也可以再下载一个MSVC的C++后选msvc版本的,只不过要先在离线环境先把msvc C++工具装好);

【GNU的有些程序需要gcc编译器,大概10多M;但是需要GCC编译的程序有时候哪怕安装了也会有问题无法编译,很蛋疼,,这个时候可以看看是哪个crate依赖了这个需要gcc编译的crate,看看是不是optional的依赖,是的话可以直接在.cargo的index/.cache找到对应的crate的文件如actix-http,然后用notepad++打开删掉对应actix-http版本里的不需要的optional依赖后保存[项目应该要clean一下],如果不是optional的就没法了,只能看下换个gcc是否可用。。【注意,如果这个optional依赖被默认启用了,那么可能源码也得修改一下即.cargo的src里的Cargo.toml和Cargo.lock】】

【顺带说一句,cargo编译依赖的crate源码是从.cargo里的src里获取的,所以极端情况下可以直接改里面的源码来通过编译也行】

二、下载相关IDE工具和插件(这里就用IDEA或Clion+toml和rust插件);

三、先通过有网的环境下载自己需要的第三方库到.cargo里(添加项目依赖库的方式),然后将.cargo打包(src目录可以不要,index里的.git似乎也可以进行缩减?【.git的objects的pack目录可以不要,.last-updated确认可以不要】)【记得所有需要的第三方库都在一个项目里添加build产生Cargo.lock文件】

四、在git里下载rust源码(不是通过rustup安装的是不会默认安装源码的【以后会不会不知道,1.44.1不会】),git clone --branch 1.44.1 --depth 1 https://github.com/rust-lang/rust【这里1.44.1是自己rust版本】

【注意Rust源码需要配置RUST_SRC_PATH系统参数,值是解压后的rust目录的src目录,注意是里面的src目录而不是外层git项目根目录】

【这个源码IDE里需要配置,IDEA配置是在Rust项里有个配置Standard Library的地方选择下载的rust源码根目录即可,其他的IDE可以到时候自己查】

五、将有网时添加Cargo.toml文件依赖(最好是需要的离线依赖都在这一个项目里添加)然后build后生成的Cargo.lock文件也需要拷贝到离线开发环境【Cargo.toml也添加一份,否则改Cargo.lock改死,用Cargo.toml做减法】;

【重要】注意将所有的第三方库添加到一个项目里,然后cargo build后需要用和将要拷贝的IDEA同版本(插件也同版本)的IDEA导入这个项目后 refresh cargo project 一下后并run一遍,这样生成的.cargo依赖和index才是完整的。

六、将前面几个步骤的东西拷贝到无网环境下,首先安装standlone(离线版)的rust(过程中最好选择只为当前用户使用rust)【如果是msvc的先安装C++工具】【安装的时候最好把rls勾选一下】;

然后配置CARGO_HOME环境变量为当前用户目录的.cargo目录(此时还不存在这个目录);配置好后记得用echo %CARGO_HOME%看下是否成功(这个关系到cargo能否离线使用第三方库)

,如果是git bash,则是$CARGO_HOME【注意,需要在git安装目录的etc目录的bash.bashrc文件最后用export来配置】

然后将.cargo里的文件复制到离线开发环境的%CARGO_HOME%目录里;

然后安装IDEA的rust相关插件;

然后配置IDEA rust源码;

接着创建项目,然后项目里添加自己需要用到的第三方依赖,比如fastrand;然后运行(其实不运行那么快也行,先把Cargo.lock搞定,如果没有生成直接复制粘贴改项目package名即可);

此时运行肯定会去访问crates.io,然后没有网肯定失败(Ctrl C掉),但是这个时候会生成Cargo.lock文件;

我们只需要修改这个文件,手动添加依赖的第三方库的配置,比如[[package]]以及package内的dependencies等(直接从拷贝的Cargo.lock里复制粘贴修改);

保存后我们再次cargo run就不会访问crates.io了;【注意,Cargo.lock里的配置必须和我们复制的.cargo是一致的】【可以把IDEA里的Watch Cargo.toml取消掉并用offline,然后run配置里要加--offline,我们手动refresh cargo project】

IDEA最好是2019.2.4以上版本,这个版本我测试成功(插件下载对应最新的)

注意,第三方库是可以增量添加的,比如我们后来发现缺了一个mm库,然后我们把mm库也添加到依赖了所有需要的第三库的项目里cargo build,然后自然会去下载这个库到.cargo里;

我们通过Cargo.lock查看这个mm库依赖了哪些其他库(最好是下载的时候看控制台下载了哪些crate,有一些虽然是被mm依赖但是之前已经有的 是不需要增量添加的,会提示:Downloaded bincode v1.3.1
  Downloaded 1 crate (26.1 KB) in 5.21s)这样的信息。

,然后把这些库的cache和index(的cache)拷贝一份【注意,index(index的cache)里对于一个库如hmac如果有多个版本它也是只有一个文件对应(文件内部有这些版本的信息)

,因此如果下载了新版本需要拷贝index里的这个文件覆盖,而cache则拷贝新版本即可】

,然后再拷贝一份新的Cargo.lock文件即可完成增量添加;

对于交叉编译工具的离线安装方式:

1.由于standlone是没有rustup的,因此需要在有网环境下以rustup-init.exe安装一份rust(用自定义安装,如果standlone是gnu则安装gnu,是msvc则安装msvc防止可能出问题);

安装好后将会在.cargo目录里新增bin目录,里面有rustup.exe文件,将它复制到之前rust安装的目录(默认是~AppDataLocalProgramsRust stable GNU 1.44)的bin目录里;

2.将.rustup目录删掉(也可以先备份),以rustup安装的rust会自动在~/下生成.rustup目录,这删掉是防止后续添加的toolchain和target不好找;

3.将.cargo里的bin目录备份一下,然后删掉里面的除了rustc.exe和rustup.exe之外的所有文件,理由同上;

4.用rustup添加toolchain和target,命令为:rustup toolchain install stable-x86_64-unknown-linux-gnu,然后添加target,命令为:rustup target add x86_64-unknown-linux-gnu

然后我们将这些文件拷贝,1是.cargo里的bin目录(只剩下rustc和rustup,其实添加rustup.exe即可[同时放.cargo和安装目录两处],因为rustc.exe可以在rust安装目录里复制),2是.rustup目录【里面的tmp,download内可以删掉,toolchains里的share里面的内容也可以删掉】

【好吧,问题一大堆,没搞定】

原文地址:https://www.cnblogs.com/silentdoer/p/13263390.html