[技巧] 同硬碟不同OS動態切換 Rustup/Cargo 路徑
問題
Linux 上不管切換到 x86 還是 Arm 工作上都是用同一個 mount 到的路徑,所以 $HOME 其實資料都一樣。
但如果我在 x86 上安裝 Rustup 和 Cargo 到預設的路徑 ~/.rustup 和 ~/.cargo,假設我安裝了 exa,切換到 Arm 上後就會跳出下面這樣的錯誤訊息:
-bash: /xxx/.cargo/bin/exa: cannot execute binary file
原因
因為 Cargo 的 packages 當初是在 x86 上編譯的,當然就沒辦法在 Arm 平台上執行。
解決方式
第一個直覺想法就是,有沒有辦法在 x86 與 Arm 上都安裝同一個 package,只是安裝在不同路徑。查了一下網路就看到如何客製化 Rustup/Cargo 安裝在自訂的路徑:
- Rustup: 執行 rustup-init 前設定 RUSTUP_HOME
- Cargo: 執行 rustup-init 前設定 CARGO_HOME
利用這樣的環境變數,我們就可以寫一些 Bash scripts 來達到多個 OS 上的安裝和動態切換。
Bash Script: 安裝 Rustup 在不同的 OS 上
例如我們在 x86 上安裝就可以這樣寫:
#!/bin/bash
export RUSTUP_HOME="$HOME/x86_64/rustup"
export CARGO_HOME="$HOME/x86_64/cargo"
cd "$RUSTUP_HOME"
# Download rustup script
curl https://sh.rustup.rs -sSf >rustup.sh
# Install rustup
bash rustup.sh -y --no-modify-path
在 Arm 上安裝就換一下 RUSTUP_HOME 和 CARGO_HOME 路徑就好:
#!/bin/bash
export RUSTUP_HOME="$HOME/arm64/rustup"
export CARGO_HOME="$HOME/arm64/cargo"
cd "$RUSTUP_HOME"
# Download rustup script
curl https://sh.rustup.rs -sSf >rustup.sh
# Install rustup
bash rustup.sh -y --no-modify-path
Bash Script: 動態切換 Cargo 路徑
假設 x86 和 Arm 都會用 ~/.bashrc 來初始化 terminal,我們就可以寫像是下面這樣的 bash script 來偵測目前是哪個 OS,再動態設定 RUSTUP_HOME 和 CARGO_HOME:
#!/bin/bash
machine="$(uname -m)"
case "$machine" in
'aarch64')
export RUSTUP_HOME="$HOME/arm64/rustup"
export CARGO_HOME="$HOME/arm64/cargo"
export PATH="$PATH:$CARGO_HOME/bin"
;;
'x86_64')
export RUSTUP_HOME="$HOME/x86_64/rustup"
export CARGO_HOME="$HOME/x86_64/cargo"
export PATH="$PATH:$CARGO_HOME/bin"
;;
*) ;;
esac
unset machine
這樣子不管是在 x86 或 Arm 上面開 Bash terminal,安裝過的 Cargo packages 都可以執行。
不過分開兩地管理的話身為管理者可能就要額外注意像是兩邊版本不同步,或是有一邊忘記安裝 packages 等的問題。但對於個人使用上就不太會有多大的問題。
留言
發佈留言