可以通過命令:cargo generate-lockfile --offline
來離線生成Cargo.lock文件而不編譯。
前言:有的時候我們的開發環境不允許我們聯網,那么就需要用到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插件【經過測試,目前還是用VSCode+RustAnalyzer(插件+服務端)比較好】);
三、先通過有網的環境下載自己需要的第三方庫到.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目錄【注意1.47后是rust/library目錄】,注意是里面的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安裝的目錄(默認是~AppData\Local\Programs\Rust 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里面的內容也可以刪掉】【好吧,問題一大堆,沒搞定】