TOML(Tom’s Obvious, Minimal Language)是一種給人讀寫的設定檔格式:每一行是 鍵 = 值,值的型別由寫法本身決定(字串要加引號、數字與布林值不加),用方括號的表頭把鍵分組,可以寫 # 開頭的註解,沒有用縮排表示結構。規格由 toml.io 維護,1.0.0 在 2021 年 1 月發佈,1.1.0 在 2025 年 12 月發佈;Python 的 pyproject.toml、Rust 的 Cargo.toml 都用這個格式,跟 HCL 與 .env 同樣是描述設定的檔案:比起 HCL,TOML 只描述資料、沒有變數與函式;比起 .env,TOML 有型別、分組與巢狀結構。

概念位置

TOML 在設定檔格式裡的位置介於 JSON 與 YAML 之間:跟 JSON 一樣每個值的型別都由寫法明確決定,跟 YAML 一樣可以寫註解、適合人手動編輯。它只描述資料,需要變數、迴圈與條件來描述基礎設施時用的是 HCL 這類設定語言。它在本站被用來寫主機的維護清單,選它的理由與實測見 主機維護清單寫成 TOML:JSON、YAML、TOML 的取捨、TOML 1.0 與 1.1 的版本差異、清單的欄位設計與只讀檢查腳本;Python 打包設定裡的 TOML 用法見 6.1 pyproject.toml 完整指南。

可觀察訊號

需要讀懂 TOML 的情境包括:打開一個副檔名是 .toml 的設定檔、要判斷某個值會被程式讀成字串還是數字、在 JSON、YAML、TOML 之間選設定檔格式,以及解析器回報 TOMLDecodeError 這類錯誤、而同一份檔案在另一台機器上解析得過。

設計責任

TOML 的基本結構:

 1# 註解
 2name = "web-demo"          # 字串一定要加引號
 3port = 443                 # 整數
 4enabled = true             # 布林值只有 true 與 false
 5checked_at = 2026-10-26T06:21:00Z   # 有時區的日期時間,解析成帶時區的時間物件
 6
 7[host]                     # 表格(table):底下的鍵屬於 host
 8provider = "oracle-cloud"
 9
10[[entrypoint]]             # 表格陣列(array of tables):每出現一次就新增一筆
11port = 443
12exposure = "cdn-only"
13
14[[entrypoint]]
15port = 22
16exposure = "admin-only"
  • [名稱]:表格(table),指一組鍵值,等於程式裡的一個物件,跟試算表的格子無關;底下的鍵到下一個表頭為止都屬於它。
  • [[名稱]]:表格陣列,每出現一次就在陣列裡加一筆,適合同一種項目要列很多筆的清單(入口、檢查項目、步驟)。
  • 型別由寫法決定:"no" 是字串,不加引號的 no 不屬於任何型別,解析器報錯;YAML 1.1 的解析器(例如 PyYAML)把不加引號的 no 讀成 false(英文資料常稱為 Norway problem)、010 讀成 8。寫法剛好屬於另一個型別時,TOML 一樣照那個型別讀:不加引號的 1.10 是浮點數 1.1。所以版本號這類看起來像數字的字串要加引號。
  • 日期與時間是原生型別:有時區的日期時間、沒有時區的日期時間、日期、時間各是一種型別,不必用字串存再自己解析。
  • 巢狀的表格陣列:[[entrypoint.verify]] 屬於它上面最近的那一筆 [[entrypoint]],讓每一筆項目各有自己的一組子項目。
  • 寫在同一行的表格(inline table):verify = { command = "...", expect_stdout = "ok" },適合只有幾個欄位的子項目;TOML 1.0 要寫在一行內、結尾不能有逗號。
  • 兩種字串:雙引號的基本字串處理反斜線跳脫(regex 的 \. 寫成 \\.),單引號的字面字串不處理任何跳脫(寫成 '\.')。
  • 數字的分隔:整數可以用底線分隔位數,1_073_741_824 等於 1073741824。

跟其他格式的差別:

格式註解型別怎麼決定結構怎麼表示適合的場景
JSON不能寫法決定,規則嚴格大括號與中括號程式之間交換資料
YAML能不加引號的值由解析器推測(版本之間規則不同)縮排巢狀很深的設定(Kubernetes、CI 的 workflow)
TOML能寫法決定,不加引號又不是合法值時報錯表頭與表格陣列人手動維護、層數不深的設定與清單

版本對解析器的影響:1.1.0 新增的語法(寫在同一行的表格 inline table 可以跨行並在結尾加逗號、\xHH 與 \e 跳脫、時間可以省略秒)只有支援 1.1 的解析器讀得懂。Python 的標準函式庫 tomllib 在 3.11 加入時支援 1.0,3.15 起支援 1.1,3.10 以下沒有 tomllib、要另裝 tomli。同一份用了 1.1 語法的檔案,在 Python 3.15 解析得過,在 3.12 會報錯;版本對不上時的兩種結果與寫檔時的對策,見 主機維護清單寫成 TOML:JSON、YAML、TOML 的取捨、TOML 1.0 與 1.1 的版本差異、清單的欄位設計與只讀檢查腳本〈TOML 1.0 與 1.1 的差異與解析器的版本〉。tomllib 只能讀不能寫,要由程式寫出 TOML 時需要第三方套件。

鄰卡