Rust 2018開發(fā)環(huán)境配置與效率工具

文檔列表見: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
    
  1. 安裝Rsut,如果要安裝nightly編譯工具鏈才加--channel=nightly
    curl -sSf https://mirrors.ustc.edu.cn/rust-static/rustup.sh | sh # -s -- --channel=nightly
    
  2. 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

  1. appveyor配置文件appveyor.yml
    language: rust
    sudo: false
    
    matrix:
      include:
    
      - rust: stable
        script:
        - cargo test --all --locked
        - rustup component add rustfmt-preview
        - cargo fmt -- --write-mode=diff
    
  2. travis配置文件.travis.yml
    language: 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)這一目標。

  1. 安裝
    cargo install cbindgen
    
  2. 更新cbindgen
    cargo install --force cbindgen
    
  3. 使用方式一:命令行執(zhí)行
    cbindgen crate/ -o crate/bindings.h
    
  4. 使用方式一:作為項目的預處理使用方式寫成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"時會出錯,詳細說明見官方文檔。

  1. 安裝 cargo install bindgen
  2. 使用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 可解決此問題。

  1. 安裝sccache cargo install sccache
  2. 配置sccache環(huán)境變量 export RUSTC_WRAPPER=sccache

rustfmt 統(tǒng)一代碼風格

為避免無意義的風格爭論,推薦使用Rust官方出品的統(tǒng)一代碼風格組件rustfmt。以下所有命令都需要在已配置好Rust環(huán)境的終端上執(zhí)行。

  1. 安裝
    rustup component add rustfmt-preview
    
  2. 更新rustfmt版本,使用update命令可更新所有rustup已安裝的組件。
    rustup update
    
  3. 使用 cargo fmt

自定義rustfmt代碼風格

不建議自定義代碼風格,最好和官方默認代碼保持一致。 定制風格規(guī)則參考rustfmt#configuring-rustfmt。

用built輸出Rust項目構建信息

built是個編譯依賴(dev-dependencies)的開源項目,詳細用法見項目說明。

  1. 配置Cargo.toml

    [dev-dependencies]
    built = "*"
    
  2. 使用示例

    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)庫。

  1. 安裝 cargo install cargo-lipo
  2. 在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 RUSTFLAGS environment variable. The Rustc compiler has a flag -C llvm-args=val that 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

參考:libc .travis.yml文件

Rust開發(fā)Android JNI項目的效率工具

cargo-rumo

支持編譯Android/iOS跨平臺

  1. 安裝cargo-rumo
    cargo install rumo
    
  2. 編譯當前項目為APK
    rumo build
    
  3. 安裝APK到模擬器或手機
    rumo device-install
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一.選擇合適的編輯器,提高編程效率 代碼編輯器的選擇,可以說是開發(fā)者社區(qū)中一個經久不衰的話題,現(xiàn)今編輯器的數(shù)量數(shù)不...
    露餡的番茄閱讀 65,656評論 0 58
  • 一、安裝JDK 請參考:Linux下快速安裝JDK 二、搭建zookeeper集群 請參考:zookeeper集群...
    57山本無憂閱讀 661評論 0 0
  • 無語斜暉,夕照晚云歸。偶傍黃昏燈漸卻,一簾孤影明滅。 離情易碎難圓,參差如縷如煙。窗外春山無限,空畫一枝啼鵑。
    一曲笛音鎖楓葉閱讀 163評論 0 1
  • 推遲滿足感 承擔責任 忠于事實 保持平衡
    a0001911cc5a閱讀 242評論 0 0
  • **如果你有好的解決方案,歡迎分享。 ** 思路,改變TextView的selected的屬性和selector選...
    sun_wenming閱讀 1,459評論 2 0

友情鏈接更多精彩內容