6.

TOML(.toml)の完全ガイド — Cargo.toml・pyproject.toml・YAML/JSON との比較

編集
この記事の要点
  • TOML(Tom's Obvious Minimal Language)は明確で曖昧性が少ない設定向け形式
  • GitHub 共同創業者 Tom Preston-Werner が 2013 年に発表、最新仕様は v1.0.0(2021 年)
  • Rust の Cargo.toml、Python の pyproject.toml で広く採用されている
  • テーブル ([section]) と配列テーブル ([[array]]) によるフラットで読みやすい構造
  • YAML より曖昧性が少なく、INI より厳密で型安全
  • コメント (#) ・末尾カンマ可・日時型ネイティブ対応・UTF-8 必須

概要

TOML(トムル、Tom's Obvious Minimal Language)は、GitHub 共同創業者の Tom Preston-Werner(マスコットの mascot Mojombo)が 2013 年に発表した、設定ファイル向けのデータシリアライゼーション形式です。「明確(obvious)で最小限(minimal)」を哲学に掲げ、INI ファイルの読みやすさを残しつつ、JSON のような厳密な型システムを備えています。

拡張子は .toml、MIME タイプは application/toml。最新仕様は v1.0.0(2021 年 1 月)。Rust のパッケージマネージャ Cargo(Cargo.toml)、Python の標準ビルド設定(pyproject.toml、PEP 518 / PEP 621)、Hugo(hugo.toml)、Poetry、Black、Ruff など、近年の開発者向けツールチェーンで強い存在感を発揮しています。Python 3.11 からは標準ライブラリに tomllib が追加されました。

構文・データモデル

キー = 値の行と、[section] のテーブル見出しで構造化します。値の型は string / integer / float / boolean / datetime / array / inline table と豊富です。

# これはコメント
title = "TOML サンプル"

[owner]
name = "Alice"
dob = 1990-05-27T07:32:00Z   # 日時型ネイティブ対応

[database]
enabled = true
ports = [8000, 8001, 8002]
data = [["delta", "phi"], [3.14]]
temp_targets = { cpu = 79.5, case = 72.0 }   # インラインテーブル

[[servers]]                   # 配列テーブル
name = "alpha"
ip = "10.0.0.1"

[[servers]]
name = "beta"
ip = "10.0.0.2"

Cargo.toml の実例(最も目にする TOML):

[package]
name = "my-app"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }

主な用途

  • Rust エコシステム: Cargo.toml(パッケージ定義)、rustfmt.tomlrust-toolchain.toml
  • Python エコシステム: pyproject.toml(PEP 518 / 621、ビルド・依存・メタデータの一元化)、Poetry・Black・Ruff・mypy などほぼ全ツールが採用
  • 静的サイトジェネレータ: Hugo(hugo.tomlconfig.toml)の標準設定
  • クラウド・CLI ツール: Netlify、Fly.io(fly.toml)、Cargo Lambda など
  • アプリケーション設定: 階層が深すぎず、人間が手で書く設定ファイル全般

関連形式との比較

項目TOMLYAMLJSONINI
仕様の厳密さ非常に厳密緩い(暗黙変換)厳密仕様統一なし
コメント可(#可(#不可可(; or #
日時型ネイティブ対応ありなし(文字列)なし
ネストテーブル+ドットインデント波カッコ基本フラット
可読性高(フラット気味)非常に高い高(ただし機能不足)
主用途Rust・Python 設定K8s・CIAPI・データ交換レガシー設定

編集・パーサ・ツール

  • Python: 標準ライブラリ tomllib(3.11+、読み取り専用)、書き込みには tomli-w / tomlkit
  • Rust: toml クレート(serde 連携)
  • Go: BurntSushi/toml が定番
  • JavaScript / Node.js: @iarna/tomlsmol-toml
  • PHP: yosymfony/toml
  • VS Code: Even Better TOML 拡張がシンタックスハイライト・スキーマ対応を提供
  • taplo: TOML 用フォーマッタ・Linter・LSP サーバ

注意点・落とし穴

  • 文字列は必ずクォート: YAML や INI と違って裸の文字列は書けない。name = Alice はエラー
  • キー重複は不可: 同じテーブル内で同じキーを定義すると仕様違反
  • テーブル定義の順序: [a.b][a] の両方を書くとき、後から親 [a] を定義するとサブテーブルが上書きされて壊れる
  • 深いネストは苦手: 3 階層を超えるとドット記法が長くなり可読性が落ちる。深い構造には YAML・JSON が向く
  • バージョン差異: v0.5 と v1.0 で挙動が違うパーサがある。tomllib は v1.0 準拠
  • 日時型のタイムゾーン: RFC 3339 形式必須。Z+09:00 を省略するとローカル日時扱いで曖昧になる

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTML(.html / .htm)
  2. CSS(.css)
  3. JSON(.json)
  4. XML(.xml)
  5. YAML(.yaml / .yml)
  6. TOML(.toml)
  7. env(.env)
  8. INI(.ini)
  9. properties(.properties)
  10. conf(.conf)

最近更新/作成されたページ