先理解訊息:YAML 能解析,不代表設定結構正確
yaml: unmarshal errors 通常表示程式把 YAML 文字轉成內部設定結構時,某個鍵或值無法放進預期欄位。它和「檔案完全不是 YAML」有關但不相同:有些檔案在一般 YAML 語法上成立,卻把字串欄位寫成清單、把布林欄位寫成物件,到 Mihomo 結構映射時才失敗。
先分成兩層。第一層是 YAML 語法與階層,例如 Tab、縮排、冒號後缺空格、引號未閉合;第二層是 Mihomo 結構,例如未知欄位、父層錯誤、值型別不符。Mihomo YAML 語法頁強調大小寫敏感、空格縮排、同層左對齊、冒號後空格與陣列短橫線。設定參考則用來確認欄位本身。
分開回答兩個問題:「是合法 YAML 嗎?」與「符合目前 Mihomo 版嗎?」一般 YAML 驗證通過只能回答前者。
不要看到錯誤就刪除訂閱或重裝客戶端。先複製原始檔,記錄完整錯誤、客戶端與核心版、設定來源和最近變更。更新後才出錯就保留前一版;手動編輯後出錯則先檢查本次差異。小範圍修正比重建整份設定更容易驗證。
從第一個行號處理,並查看父層與前一段
訊息可能是 line 42: cannot unmarshal ...,也可能一次列出多行。先處理第一條,因為前面的層級錯誤會讓後續欄位落入錯誤位置,產生連鎖訊息。行號常是解析器確認矛盾的位置,不保證筆誤就在該行;未閉合引號、上一段少縮排或錯誤清單起點可能更早。
- 建立只讀備份,不在唯一副本持續試錯。
- 以顯示行號、空白字元和 UTF-8 的純文字編輯器開啟。
- 定位第一條錯誤,向上查看同一父層與前一個清單項目。
- 把小段與官方欄位範例比較,不先格式化整份檔案。
- 只修一個確定問題,另存副本並重新驗證。
若該行包含節點機密,不要公開整行。保留欄位名和資料型別,把伺服器、UUID、密碼和訂閱參數換成占位符;但要保留空格數量和短橫線位置,否則失去層級證據。
| 訊息片段 | 優先含義 | 檢查範圍 |
|---|---|---|
| did not find expected key | 鍵、引號或前段語法中斷 | 本行與上方數行 |
| cannot unmarshal !!seq into string | 字串欄位收到清單 | 欄位文件與短橫線 |
| cannot unmarshal !!map into bool | 布林欄位收到物件 | 縮排與預期型別 |
| field ... not found | 未知欄位、拼字或版本 | 目前核心文件 |
編輯器的視覺換行不會改變真正行號,但聊天工具可能在貼上時轉換 Tab。應在原始純文字副本顯示不可見字元,再取最小且已脫敏的片段。
先修縮排、Tab、冒號與引號等語法問題
YAML 以縮排表示父子關係,不能用括號補救。官方語法說明要求使用空格而非 Tab、同層左側對齊、鍵的冒號後加空格,陣列項目從同層短橫線開始。兩格或四格可依檔案風格,但同一層必須一致。
下列錯誤例在項目前用了 Tab,且 type 沒和 name 對齊:
proxies:
- name: Example
type: ss
改成純空格並對齊同一代理物件:
proxies:
- name: Example
type: ss
mixed-port: 7890 的冒號後要有空格。URL、IPv6 或含 # 的文字在有歧義時依文件加引號,否則後段可能成為註解。引號必須成對,排版軟體的智慧引號不能替代 ASCII 引號。
不要全域重排空格:自動格式化可能改變多行文字、規則或腳本。只改已確認的結構範圍,保留原副本。
YAML 1.2.2 規格用來理解通用語法,Mihomo 文件則更接近實際欄位。先得到合法 YAML,再檢查設定型別。
語法通過後,檢查字串、數字、布林、物件與清單
cannot unmarshal 會提示來源與目標型別。!!seq 是清單,!!map 是鍵值物件,!!str 是字串,數字和布林也有各自型別。訊息不是叫你把所有短橫線刪掉,而是指出特定欄位收到與定義不同的結構。
例如把連接埠寫成帶引號字串,又把布林開關寫成清單:
mixed-port: "7890"
allow-lan:
- true
依設定參考確認後應類似:
mixed-port: 7890
allow-lan: true
反過來,proxies、proxy-groups 和 rules 通常本來就是清單,不能為消除 !!seq 全部變成單一字串。每個欄位要分別對照目前版本。欄位名有大小寫與連字號要求;從舊核心或其他客戶端複製的鍵可能不存在或層級不同。
- unknown field:查拼字、大小寫、版本與父層。
- sequence into scalar:確認欄位接一值或多項。
- map into scalar:檢查多一層縮排是否創造物件。
- 重複鍵:不依賴覆蓋行為,合併成明確欄位。
- null 或空值:依文件刪除、填有效值或保留空字串。
若問題來自遠端訂閱,不要長期改客戶端快取,更新會覆蓋。先確認服務商提供 Mihomo 格式;需本機調整時使用客戶端正式支援的覆寫機制。
使用最小變更與同版本核心驗證,再恢復完整內容
大型設定同時有節點、規則集、DNS、TUN 和腳本。修復方式是保留原件,對第一條錯誤做最小變動,而不是一次刪除所有可疑區塊。仍無法定位時,可在離線副本二分註解非必要段落;每次維持完整 YAML 層級並記錄移除範圍。
可用與客戶端相同版本、相同平台的 Mihomo 執行設定測試,常見形式如下,路徑要改成自己的脫敏副本:
mihomo -t -f /path/to/config.yaml
不要為驗證而從未知網站下載另一個核心。線上 YAML 工具可能上傳完整設定並洩漏憑證,且通常只能檢查通用語法。優先本機測試;需要求助時只分享最小復現片段。
- 為原始檔與最近可用版各留一份只讀副本。
- 只修第一個語法或型別錯誤,再執行同版檢查。
- 逐條處理剩餘訊息,不因數量多就整份重寫。
- 通過後由客戶端載入副本,先關閉系統代理與 TUN。
- 檢查設定、策略群組、DNS 日誌,再做一次實際連線。
- 穩定後才替換正式設定,並保留回復副本。
完成標準:設定檢查無錯誤、核心持續運作、預期群組存在、日誌沒有讀回舊檔,而且實際請求命中可解釋規則。只看到儲存成功不夠。
未知欄位仍存在時,向維護者提供核心版、第一條完整錯誤、已脫敏的父層與參考的官方文件。不要附訂閱 Token、伺服器密碼或整份正式設定。
官方來源與版本邊界
版本號、檔案名稱與介面文字可能隨專案更新而變動,操作前請以連結中的專案文件為準。