rustlings v6.0 執行時出現 “ You are trying to run Rustlings using the old method before version 6”

likkoliu發表於2024-08-24

背景

在之前學習 rust 時,使用過一段時間 rustlings 感覺還不錯,但是之前的學習只把 rustlings 的題目刷了一半,然後想再從頭到尾刷一遍 rustlings 的題目。

在 rustlings 的 README.md 文件中也沒有找到重置 rustlings 的方法,而且官方的分支也更新到了 v6.2.0(我之前使用的似乎是 v5.x 版本的)。索性直接把整個資料夾刪掉,再重新搞一遍,順便也可以試試 v6.2.0 有啥不一樣,一石二鳥。

然後,按之前的記憶安裝 rustlings(就是沒細看現在的 README.md 文件,因為之前的安裝記憶猶新...)。然後就是一半是按記憶裡的,一半是那個 README.md 文件裡的,具體就是:

$: git clone https://github.com/rust-lang/rustlings.git
$: cd rustlings/
$: cargo install rustlings
$: rustlings init

然後,就報錯了...

$:~/rust/rustlings$ rustlings
Error: You are trying to run Rustlings using the old method before version 6.
The new method doesn't include cloning the Rustlings' repository.
Please follow the instructions in `README.md`:
https://github.com/rust-lang/rustlings#getting-started

分析

按終端的提示資訊應該是一箇舊版本的 rustlings 和一個 version 6 版本的 rustlings 有衝突,初步感覺是之前的 rustlings 沒解除安裝乾淨。

那好,就再按規範再解除安裝一次 cargo uninstall rustlings,保險起見還在目錄裡敲了個 cargo clean

然後,我再

$: git clone https://github.com/rust-lang/rustlings.git
$: cd rustlings/
$: cargo install rustlings
$: rustlings init

然後,就又報錯了...

$:~/rust/rustlings$ rustlings
Error: You are trying to run Rustlings using the old method before version 6.
The new method doesn't include cloning the Rustlings' repository.
Please follow the instructions in `README.md`:
https://github.com/rust-lang/rustlings#getting-started

進一步分析

明顯感覺到不對勁,然後我直接在 vscode 裡把原始碼的資料夾開啟,看看這個 error 是什麼條件產生的,在 rustlings/src/main.rs

const OLD_METHOD_ERR: &str =
    "You are trying to run Rustlings using the old method before version 6.
The new method doesn't include cloning the Rustlings' repository.
Please follow the instructions in `README.md`:
https://github.com/rust-lang/rustlings#getting-started";

就是這段話,一模一樣,然後查詢 OLD_METHOD_ERR 在哪裡有呼叫,還是在這個檔案裡

    if cfg!(not(debug_assertions)) && Path::new("dev/rustlings-repo.txt").exists() {
        bail!("{OLD_METHOD_ERR}");
    }

第一個條件檢查程式碼是否在釋出模式下執行,如果程式碼在釋出模式下編譯(即沒有除錯斷言)cfg!(not(debug_assertions)) 返回 true,這個條件沒問題,我就是在釋出模式下執行的。

那麼問題就在第二個條件裡了,第二個條件檢查 dev/rustlings-repo.txt 是否存在。去到那個目錄下,果然存在這個檔案,檔案內容是

This file is used to check if the user tries to run Rustlings in the repository (the method before version 6)

好傢伙,看了這段話才恍然大悟,version 6version 5 rustlings 的安裝使用方法變更了,然後又重新看了 README.md 文件。

果然,人家現在不需要再像之前 version 5 的時候,必須先把 rustlings 的庫 clone 到本地,然後再安裝初始化使用。只需要直接在終端敲 cargo install rustlings 然後正常的初始化就可以使用了,省了之前的 庫 clone 到本地 那一步。

解決方法

$: cargo install rustlings
$: cd rustlings/
$: rustlings init

總結

這 rustlings 版本更新後,也不在 README.md 文件明說一下version 6version 5 rustlings 的安裝使用方法變更了,坑坑坑。

好吧,好像根本原因在我沒細看人家的文件...

相關文章