文檔列表見:Rust 移動端跨平臺復雜圖形渲染項目開發(fā)總結 - 目錄
一句話概括:macOS/Linux用戶首選CLion + Rust插件,折騰VSCode收益太低。以下內容都是參與開發(fā)gfx-rs等Rust圖形項目時所作嘗試的總結。
配置Rust編譯環(huán)境
使用Rust開發(fā)macOS、iOS、Android等跨平臺共享源碼的項目,開發(fā)環(huán)境避免不了這些系統(tǒng)所要求的開發(fā)環(huán)境,即:
- macOS、iOS需要安裝Xcode
- Android需要Android Studio、Android SDK、Android NDK,并且配置SDK、NDK到環(huán)境變量。如果不想手工配置SDK、NDK變量,對于macOS,推薦先安裝Android Studio到Application,之后通過Android Studio安裝Android SDK、NDK,然后向profile、zsh配置文件等寫入SDK、NDK變量。
-
修改Rust軟件更新源為中科大站點對國內用戶而言可以提高下載速度,已翻墻可不考慮。
// 1. 打開環(huán)境變量配置文件 vi ~/.bashrc // 2. 加入如下內容 export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup // 3. 激活新配置內容 source ~/.bashrc
- 安裝Rsut,如果要安裝nightly編譯工具鏈才加
--channel=nightlycurl -sSf https://mirrors.ustc.edu.cn/rust-static/rustup.sh | sh # -s -- --channel=nightly - cargo環(huán)境變量設置
當前版本的cargo裝好后,并不自動設置環(huán)境變量。在此進行手動配置,方便后面使用cargo安裝的效率工具。在此以macOS為例,mac上的cargo一般安裝在~/.cargo/bin下。export CARGO_BIN="[你的HOME目錄]/.cargo/bin" export PATH="$PATH:$CARGO_BIN"
IDE配置
CLion與推薦插件
- Rust插件
提供代碼提示、補全、跳轉等功能,比Rust Language Server(RLS)穩(wěn)定、好用,插件功能的更新速度快 - Toml
方便編寫Cargo.toml文件 - Active Intellij Tab Hightlighter
高亮當前打開的Tab頁 - Dash
查文檔方便 - Git Conflict
在源文件中用顏色區(qū)分代碼沖突,比Intellij系列產品原生做法更直觀 - Grep Console
過濾控制臺輸出,比默認功能更強 - HighlightBracketPair
高亮顯示光標所在的區(qū)域,比如在某個{},()或[]內。
不推薦Visual Studio Code的原因
RLS不穩(wěn)定導致代碼跳轉經常失效是最重要的原因,但是,VSCode的優(yōu)勢是,在無法代碼跳轉的情況下還能提供比CLion更強的代碼提示,這讓我感到意外。
另外,VSCode配置起來麻煩,對Rust新手不友好。
效率工具
CI配置appveyor與travis
- appveyor配置文件
appveyor.ymllanguage: rust sudo: false matrix: include: - rust: stable script: - cargo test --all --locked - rustup component add rustfmt-preview - cargo fmt -- --write-mode=diff - travis配置文件
.travis.ymllanguage: rust rust: - stable - nightly branches: except: - staging.tmp before_install: # Do not run bors builds against the nightly compiler. # We want to find out about nightly bugs, so they're done in master, but we don't block on them. - if [[ $TRAVIS_RUST_VERSION == "nightly" && $TRAVIS_BRANCH == "staging" ]]; then exit; fi script: - cargo test - cargo build #--manifest-path your_project_path/Cargo.toml --features remote - cargo build #- (cd examples && make) #TODO
cbindgen 給Rust代碼自動生成C頭文件
給iOS/Android等編寫跨平臺C++/Rust項目最終還是以C接口方式讓外部使用,當提供較多接口時,手寫容易出錯、開發(fā)慢,此時用自動頭文件生成器是更合理的選擇,cbindgen可幫我們實現(xiàn)這一目標。
- 安裝
cargo install cbindgen - 更新cbindgen
cargo install --force cbindgen - 使用方式一:命令行執(zhí)行
cbindgen crate/ -o crate/bindings.h - 使用方式一:作為項目的預處理使用方式寫成
build.rs,對于復雜項目,推薦用此方案extern crate cbindgen; use std::env; fn main() { let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); cbindgen::Builder::new() .with_crate(crate_dir) .generate() .expect("Unable to generate bindings") .write_to_file("bindings.h"); }
bindgen 給C頭文件生成Rust綁定代碼
和cbindgen相反,bindgen可生成Rust調用C函數(shù)所需的FFI綁定代碼,但是這個工具在遇到多重包含如#include "other_file.h"時會出錯,詳細說明見官方文檔。
- 安裝
cargo install bindgen - 使用
bindgen input.h -o bindings.rs-
--rust-target指定Rust版本,如--rust-target 1.30 -
--rust-target nightly使用nightly工具鏈
-
sccahe 多工作區(qū)共享編譯緩存
目前Rust只支持工作區(qū)workspace內部多個項目間的編譯緩存,不支持workspace之間的緩存。對于多個workspace引用了部分相同版本的組件,這花費了多余的編譯時間,沒意義。借助第三方工具sccahe 可解決此問題。
- 安裝sccache
cargo install sccache - 配置sccache環(huán)境變量
export RUSTC_WRAPPER=sccache
rustfmt 統(tǒng)一代碼風格
為避免無意義的風格爭論,推薦使用Rust官方出品的統(tǒng)一代碼風格組件rustfmt。以下所有命令都需要在已配置好Rust環(huán)境的終端上執(zhí)行。
- 安裝
rustup component add rustfmt-preview - 更新rustfmt版本,使用update命令可更新所有rustup已安裝的組件。
rustup update - 使用
cargo fmt
自定義rustfmt代碼風格
不建議自定義代碼風格,最好和官方默認代碼保持一致。 定制風格規(guī)則參考rustfmt#configuring-rustfmt。
用built輸出Rust項目構建信息
built是個編譯依賴(dev-dependencies)的開源項目,詳細用法見項目說明。
-
配置
Cargo.toml[dev-dependencies] built = "*" -
使用示例
pub mod built_info { include!(concat!(env!("OUT_DIR"), "/built.rs")); } info!("This is version {}{}, built for {} by {}.", built_info::PKG_VERSION, built_info::GIT_VERSION.map_or_else(|| "".to_owned(), |v| format!(" (git {})", v)), built_info::TARGET, built_info::RUSTC_VERSION); trace!("I was built with profile \"{}\", features \"{}\" on {} using {}", built_info::PROFILE, built_info::FEATURES_STR, built_info::BUILT_TIME_UTC, built_info::DEPENDENCIES_STR);
輸出信息:
This is version 0.1.0 (git 62eb1e2), built for x86_64-apple-darwin
by rustc 1.16.0-nightly (bf6d7b665 2017-01-15).
I was built with profile "debug", features "DEFAULT, ERR_PRINTLN"
on Thu, 16 Feb 2017 19:00:08 GMT using android_glue 0.2.1,
ansi_term 0.9.0, bitflags 0.3.3, bitflags 0.4.0, bitflags 0.6.0,
bitflags 0.7.0, block 0.1.6, built 0.1.0, byteorder 0.5.3,
bytes 0.3.0, cfg-if 0.1.0, cgl 0.1.5, cgmath 0.7.0, ...
Rust開發(fā)iOS項目的效率工具
cargo-lipo
cargo lipo一個命令可編譯出iOS目前支持的5個CPU架構靜態(tài)庫,且自動合并成一個多合一的universal靜態(tài)庫。
- 安裝
cargo install cargo-lipo - 在Rust項目任意位置執(zhí)行
cargo lipo即可開始編譯iOS靜態(tài)庫
Rust項目開啟Bitcode編譯
RUSTFLAGS="-C llvm-args=\"-fembed-bitcode\"" cargo build
You can tell cargo to pass any argument you wish to the Rust compiler by setting the
RUSTFLAGSenvironment variable. The Rustc compiler has a flag-C llvm-args=valthat you can use to pass additional arguments to llvm.
參考:Enable Bitcode Output in Cargo Build for iOS Targets?
cargo build指定需要的iOS版本
IPHONEOS_DEPLOYMENT_TARGET=7.0 cargo build
Rust開發(fā)Android JNI項目的效率工具
cargo-rumo
支持編譯Android/iOS跨平臺
- 安裝cargo-rumo
cargo install rumo - 編譯當前項目為APK
rumo build - 安裝APK到模擬器或手機
rumo device-install