TOML基本構文とは?初心者でも分かる設定ファイルの書き方完全ガイド

プログラミング・IT

プログラミングをしていると、「TOML」という形式のファイルに出会うことがありますよね。

「Cargo.toml」「pyproject.toml」といったファイルを見かけたことはありませんか?「設定ファイルだとは分かるけど、書き方がよく分からない…」と感じている方も多いはずです。

実は、TOMLは人間が読み書きしやすいように設計された、シンプルで明快な設定ファイル形式なんです。JSONやYAMLと比べても、直感的で間違いにくいのが特徴ですよ。

この記事では、TOMLの基本構文から実用的な書き方まで、プログラミング初心者の方にも分かりやすく解説していきます。

実際の例をたくさん見ながら、TOMLの書き方をマスターしていきましょう!


スポンサーリンク
  1. TOMLとは?その特徴を知ろう
    1. TOMLの正体
    2. TOMLが生まれた理由
    3. TOMLの基本思想
  2. TOMLが使われている場面
    1. 主な使用例
    2. なぜ人気なの?
  3. TOMLファイルの基本ルール
    1. ファイル拡張子
    2. 文字コード
    3. 大文字・小文字の区別
    4. 空白文字
  4. コメントの書き方
    1. 基本的なコメント
    2. 複数行コメント
    3. コメントの活用
  5. キーと値の基本
    1. キー・バリュー・ペア
    2. キーの命名規則
    3. 値の前後の空白
  6. データ型を理解しよう
    1. 1. 文字列(String)
    2. 2. 整数(Integer)
    3. 3. 浮動小数点数(Float)
    4. 4. 真偽値(Boolean)
    5. 5. 日付と時刻
  7. 配列(Array)の書き方
    1. 基本的な配列
    2. 複数行の配列
    3. ネストした配列
    4. 空配列
  8. テーブル(Table)でグループ化
    1. テーブルの基本
    2. 複数のテーブル
    3. ネストしたテーブル
    4. インラインテーブル
  9. テーブルの配列(Array of Tables)
    1. 配列テーブルの書き方
    2. ネストした配列テーブル
  10. 実践的な設定ファイルの例
    1. 例1:Webアプリケーションの設定
    2. 例2:Cargo.toml(Rustパッケージ)
    3. 例3:pyproject.toml(Pythonプロジェクト)
  11. TOMLとJSON・YAMLの比較
    1. JSONとの違い
    2. YAMLとの違い
  12. よくあるエラーと対処法
    1. エラー1:文字列のクォート忘れ
    2. エラー2:テーブルの重複定義
    3. エラー3:配列の型混在(同じ階層)
    4. エラー4:キーの重複
  13. TOMLを使いこなすコツ
    1. 1. 適切なグループ化
    2. 2. コメントで説明を追加
    3. 3. 一貫した命名規則
    4. 4. 適度に改行を入れる
  14. プログラムからTOMLを読み込む
    1. Pythonでの読み込み
    2. Rustでの読み込み
    3. JavaScriptでの読み込み
  15. まとめ

TOMLとは?その特徴を知ろう

TOMLの正体

TOMLは「Tom’s Obvious, Minimal Language」の略称です。

2013年にGitHubの共同創業者であるTom Preston-Werner氏が開発した、設定ファイル専用のデータ形式なんです。

読み方は「トムル」または「トムエル」。日本では「トムル」と呼ぶ人が多いですね。

TOMLが生まれた理由

設定ファイルには、以前から様々な形式がありました。

  • INI形式:シンプルだけど機能が少ない
  • JSON:厳密だけど人間には読みにくい
  • YAML:柔軟だけどインデントが複雑

そこで「もっと読みやすく、書きやすく、曖昧さのない設定ファイル形式を作ろう」という思いから、TOMLが誕生したんです。

TOMLの基本思想

TOMLは以下の3つの原則で設計されています:

1. 明白であること(Obvious)
見ただけで意味が分かる構文

2. 最小限であること(Minimal)
必要最小限のシンプルな文法

3. 人間が読み書きしやすいこと
曖昧さがなく、間違いにくい設計

この思想が、TOMLの全ての文法に反映されているんですよ。


TOMLが使われている場面

主な使用例

TOMLは、様々なプログラミング言語やツールで採用されています。

Rust言語

  • Cargo.toml:パッケージ管理の設定ファイル

Python

  • pyproject.toml:プロジェクト設定の標準形式

その他のツール

  • Hugo(静的サイトジェネレーター)の設定
  • Alacritty(ターミナルエミュレーター)の設定
  • Gitの設定ファイル

特にRustのエコシステムでは、TOMLが標準的な設定ファイル形式として定着しています。

なぜ人気なの?

読みやすさ
コメントが書きやすく、設定の意図が伝わりやすい

編集しやすさ
階層構造が明確で、変更や追加がしやすい

エラーが少ない
文法が厳密で、曖昧な解釈がない

学習コストが低い
すぐに理解できるシンプルな構文

これらの理由から、多くの開発者に支持されているんです。


TOMLファイルの基本ルール

ファイル拡張子

TOMLファイルは .toml という拡張子を使います。

例:config.tomlCargo.tomlpyproject.toml

文字コード

UTF-8エンコーディングが必須です。

ファイルを保存するときは、必ずUTF-8で保存してくださいね。

大文字・小文字の区別

TOMLでは大文字と小文字を区別します

nameName は別のキーとして扱われるので注意しましょう。

空白文字

スペースとタブは区別されません

どちらを使っても構いませんが、一つのファイル内では統一するのがマナーです。


コメントの書き方

基本的なコメント

TOMLでは、# 記号を使ってコメントを書きます。

# これはコメントです
name = "太郎"  # 行の途中からでもOK

# 以降、その行の終わりまでがコメントとして扱われます。

複数行コメント

TOMLには複数行コメントの専用構文はありません。

複数行にわたってコメントを書きたい場合は、各行の先頭に # を付けます。

# これは長い説明文です。
# 複数行にわたって書くことができます。
# 各行に # を付ける必要があります。

コメントの活用

設定の意味や注意点を書いておくと、後で見返したときに分かりやすいですよ。

# データベース接続設定
# 本番環境では別の値を使用すること
database_url = "localhost:5432"

キーと値の基本

キー・バリュー・ペア

TOMLの基本は、キー = 値 という形式です。

key = "value"

この形式を「キー・バリュー・ペア」と呼びます。

キーの命名規則

キーには以下のルールがあります:

使える文字:

  • 英数字(A-Z、a-z、0-9)
  • アンダースコア(_)
  • ハイフン(-)

基本的な書き方:

name = "太郎"
user_name = "taro"
max-connections = 100

クォートで囲む書き方:
特殊な文字を含む場合は、クォートで囲めます。

"127.0.0.1" = "localhost"
"キー名" = "日本語のキーも使えます"

ただし、基本的には英数字とアンダースコアだけを使うのが推奨されています。

値の前後の空白

= の前後に空白があってもなくても構いません。

name="太郎"      # これもOK
name = "太郎"    # これもOK
name  =  "太郎"  # これもOK

ただし、読みやすさのために前後に空白を入れるのが一般的です。


データ型を理解しよう

1. 文字列(String)

文字列は、クォートで囲んで表現します。

基本文字列:
ダブルクォート(")で囲みます。

name = "山田太郎"
message = "こんにちは、世界!"

エスケープシーケンス:
特殊文字は \ でエスケープします。

path = "C:\\Users\\taro\\Documents"  # バックスラッシュ
quote = "彼は\"こんにちは\"と言った"   # クォート
newline = "1行目\n2行目"              # 改行

複数行文字列:
トリプルクォート(""")を使います。

description = """
これは複数行にわたる
長い説明文です。
改行がそのまま保持されます。
"""

リテラル文字列:
シングルクォート(')を使うと、エスケープが不要になります。

windows_path = 'C:\Users\taro\Documents'  # エスケープ不要
regex = '<\i\c*\s*>'                      # 正規表現なども書きやすい

複数行リテラル文字列:

literal_multi = '''
最初の改行は削除されます。
他の改行はそのまま保持されます。
'''

2. 整数(Integer)

整数は、そのまま数字で書きます。

age = 25
max_size = 1000
negative = -42

アンダースコアで区切る:
読みやすくするために、アンダースコアで区切れます。

large_number = 1_000_000  # 100万
hex = 0xDEADBEEF          # 16進数
octal = 0o755             # 8進数
binary = 0b11010110       # 2進数

3. 浮動小数点数(Float)

小数点を含む数値です。

pi = 3.14159
temperature = -12.5

指数表記:

scientific = 1e6      # 1,000,000
small = 5e-3          # 0.005

特殊な値:

positive_infinity = inf    # 正の無限大
negative_infinity = -inf   # 負の無限大
not_a_number = nan         # 非数(Not a Number)

4. 真偽値(Boolean)

真偽値は true または false で表現します。

enabled = true
debug_mode = false

注意: 大文字は使えません。TrueFALSE は無効です。

5. 日付と時刻

TOMLでは、日時を標準的な形式で表現できます。

日付:

birthdate = 1990-05-15

日付と時刻(オフセット付き):

created_at = 1990-05-15T07:32:00Z
updated_at = 1990-05-15T07:32:00+09:00  # 日本時間

ローカル日時:

local_datetime = 1990-05-15T07:32:00

時刻のみ:

opening_time = 07:32:00

配列(Array)の書き方

基本的な配列

配列は、角括弧([])で囲み、カンマで区切ります。

colors = ["red", "green", "blue"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "two", 3.0]  # 異なる型も混在可能

複数行の配列

読みやすくするために、改行して書くこともできます。

fruits = [
    "apple",
    "banana",
    "cherry",
]  # 最後のカンマがあってもOK

ネストした配列

配列の中に配列を入れることも可能です。

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

空配列

要素がない配列も定義できます。

empty = []

テーブル(Table)でグループ化

テーブルの基本

テーブルは、関連する設定をグループ化する仕組みです。

角括弧([])でテーブル名を囲みます。

[database]
host = "localhost"
port = 5432
username = "admin"

これは以下のような階層構造を表します:

database
├── host = "localhost"
├── port = 5432
└── username = "admin"

複数のテーブル

ファイル内に複数のテーブルを定義できます。

[server]
host = "127.0.0.1"
port = 8080

host = “localhost” port = 5432

level = “info” file = “/var/log/app.log”

ネストしたテーブル

ドット(.)を使って、階層構造を表現できます。

[server.http]
port = 8080
timeout = 30

port = 8443 certificate = “/path/to/cert.pem”

これは以下の構造を表します:

server
├── http
│   ├── port = 8080
│   └── timeout = 30
└── https
    ├── port = 8443
    └── certificate = "/path/to/cert.pem"

インラインテーブル

短いテーブルは、1行で書くこともできます。

user = { name = "太郎", age = 25, city = "Tokyo" }

ただし、読みやすさを優先して通常のテーブル形式を使うのが推奨されています。


テーブルの配列(Array of Tables)

配列テーブルの書き方

同じ構造のデータを複数定義するときは、二重角括弧([[]])を使います。

[[products]]
name = "りんご"
price = 150
stock = 50

[[products]]
name = "バナナ"
price = 100
stock = 30

[[products]]
name = "オレンジ"
price = 200
stock = 20

これは、3つの製品データを持つ配列を表現しています。

ネストした配列テーブル

配列テーブルの中に、さらに配列を含めることもできます。

[[employees]]
name = "山田太郎"
position = "エンジニア"

[[employees.projects]]
name = "プロジェクトA"
status = "進行中"

[[employees.projects]]
name = "プロジェクトB"
status = "完了"

[[employees]]
name = "佐藤花子"
position = "デザイナー"

[[employees.projects]]
name = "プロジェクトC"
status = "計画中"

この構造は、従業員が複数のプロジェクトを持っている状況を表現しています。


実践的な設定ファイルの例

例1:Webアプリケーションの設定

# アプリケーション全般の設定

name = “MyWebApp” version = “1.0.0” debug = false # サーバー設定

host = “0.0.0.0” port = 8080 workers = 4 # データベース設定

driver = “postgresql” host = “localhost” port = 5432 name = “myapp_db” username = “dbuser” password = “secret123” max_connections = 50 # ログ設定

level = “info” format = “json” output = “/var/log/myapp.log” # キャッシュ設定

enabled = true type = “redis” host = “localhost” port = 6379 ttl = 3600 # 秒単位

例2:Cargo.toml(Rustパッケージ)

[package]
name = "my-rust-project"
version = "0.1.0"
edition = "2021"
authors = ["Taro Yamada <taro@example.com>"]
license = "MIT"
description = "素晴らしいRustプロジェクト"

serde = { version = “1.0”, features = [“derive”] } tokio = { version = “1.0”, features = [“full”] } reqwest = “0.11”

criterion = “0.5”

opt-level = 3 lto = true

例3:pyproject.toml(Pythonプロジェクト)

[project]
name = "my-python-app"
version = "1.0.0"
description = "素晴らしいPythonアプリケーション"
authors = [
    { name = "Taro Yamada", email = "taro@example.com" }
]
requires-python = ">=3.9"

dependencies = [
    "requests>=2.28.0",
    "numpy>=1.24.0",
    "pandas>=2.0.0",
]

dev = [ “pytest>=7.0”, “black>=23.0”, “mypy>=1.0”, ]

requires = [“setuptools>=65.0”, “wheel”] build-backend = “setuptools.build_meta”

line-length = 100 target-version = [“py39”, “py310”, “py311”]

strict = true warn_return_any = true


TOMLとJSON・YAMLの比較

JSONとの違い

JSON:

{
  "name": "太郎",
  "age": 25,
  "hobbies": ["読書", "旅行"]
}

TOML:

name = "太郎"
age = 25
hobbies = ["読書", "旅行"]

TOMLの利点:

  • コメントが書ける
  • クォートが少なくて読みやすい
  • 階層構造が明確

JSONの利点:

  • データ交換により適している
  • 多くの言語で標準サポート

YAMLとの違い

YAML:

name: 太郎
age: 25
hobbies:
  - 読書
  - 旅行
database:
  host: localhost
  port: 5432

TOML:

name = "太郎"
age = 25
hobbies = ["読書", "旅行"]

host = “localhost” port = 5432

TOMLの利点:

  • インデントのミスが起きにくい
  • 曖昧さがない
  • 型が明確

YAMLの利点:

  • より簡潔に書ける
  • より複雑な構造に対応

よくあるエラーと対処法

エラー1:文字列のクォート忘れ

間違い:

name = 太郎  # エラー!

正しい:

name = "太郎"

文字列は必ずクォートで囲む必要があります。

エラー2:テーブルの重複定義

間違い:

[server]
port = 8080

[server]  # エラー!同じテーブル名
host = "localhost"

正しい:

[server]
port = 8080
host = "localhost"

同じテーブルを2回定義することはできません。

エラー3:配列の型混在(同じ階層)

間違い:

array = [1, 2, [3, 4]]  # 整数と配列が混在

TOMLでは、配列の要素は基本的に同じ型であることが推奨されています。

正しい:

array = [[1, 2], [3, 4]]  # すべて配列

エラー4:キーの重複

間違い:

name = "太郎"
name = "花子"  # エラー!

同じキーを2回定義できません。

正しい:

name = "太郎"
nickname = "花子"

TOMLを使いこなすコツ

1. 適切なグループ化

関連する設定は、テーブルでまとめましょう。

悪い例:

db_host = "localhost"
db_port = 5432
cache_host = "localhost"
cache_port = 6379

良い例:

[database]
host = "localhost"
port = 5432

host = “localhost” port = 6379

2. コメントで説明を追加

設定の意図や注意点を書いておきましょう。

# 本番環境では環境変数から読み込むこと

host = “localhost” # 開発環境用 port = 5432 # デバッグモードは本番では必ずfalseに debug = false

3. 一貫した命名規則

キー名の命名規則を統一しましょう。

推奨:スネークケース

max_connections = 100
user_name = "admin"
cache_timeout = 3600

4. 適度に改行を入れる

読みやすさのために、セクション間に空行を入れましょう。

[server]
host = "localhost"
port = 8080

host = “localhost” port = 5432

level = “info”


プログラムからTOMLを読み込む

Pythonでの読み込み

Python 3.11以降は、標準ライブラリで対応しています。

import tomllib

with open("config.toml", "rb") as f:
    config = tomllib.load(f)

print(config["server"]["port"])

古いバージョンでは、tomliパッケージを使います。

Rustでの読み込み

Rustでは、tomlクレートを使います。

use std::fs;
use toml::Value;

fn main() {
    let contents = fs::read_to_string("Cargo.toml")
        .expect("ファイルを読み込めませんでした");

    let value = contents.parse::<Value>()
        .expect("TOMLのパースに失敗しました");

    println!("{:?}", value);
}

JavaScriptでの読み込み

Node.jsでは、@iarna/tomltomlパッケージを使います。

const toml = require('@iarna/toml');
const fs = require('fs');

const config = toml.parse(fs.readFileSync('config.toml', 'utf-8'));
console.log(config.server.port);

まとめ

TOMLは、人間が読み書きしやすい設定ファイル形式として設計されています。

この記事のポイント:

  • TOMLは明快でシンプルな構文を持つ設定ファイル形式
  • キー = 値の基本構造が直感的
  • 文字列、整数、浮動小数点、真偽値、日時、配列をサポート
  • テーブルで設定をグループ化できる
  • 配列テーブルで同じ構造のデータを複数定義可能
  • コメントで説明を追加できる
  • RustやPythonなど多くの言語で採用されている

TOMLは学習コストが低く、すぐに使い始められます。

JSONのような厳密さと、YAMLのような読みやすさを併せ持った、バランスの良い形式なんです。

プロジェクトの設定ファイルを作るとき、TOMLを選択肢の一つに加えてみてはいかがでしょうか?きっと、その使いやすさに驚くはずですよ!

コメント

タイトルとURLをコピーしました