RustプロジェクトのCargo.tomlや、Pythonのpyproject.tomlというファイルを見たことはありませんか?
「この拡張子、何の形式だろう?」と思った方も多いでしょう。
これがTOML(トムル)という、人間にとって読みやすい設定ファイル形式なんです。今回は、このシンプルで分かりやすい設定ファイル言語について、初心者の方でも理解できるように解説していきますよ!
TOMLとは?基本を理解しよう

TOMLは「Tom’s Obvious, Minimal Language」の略で、明確で最小限の設定ファイル言語です。
誰が作ったの?
GitHubの共同創業者であるTom Preston-Werner氏が2013年に開発しました。
「設定ファイルは人間が読み書きしやすくあるべき」という思想から生まれたんですね。
TOMLの特徴
人間が読みやすい:
.iniファイルのようなシンプルさと、明確な構造を両立しています。
型が明確:
文字列、数値、真偽値、日時など、データ型がはっきりしています。
曖昧さがない:
1つの書き方でしか表現できないため、混乱が少ないですよ。
UTF-8エンコーディング:
日本語などの多言語も問題なく使えます。
どこで使われている?
TOMLは、多くのプロジェクトで採用されています。
主な使用例
Rust:
# Cargo.toml(Rustのパッケージマネージャー設定)
name = “my-project” version = “0.1.0” edition = “2021”
Python:
# pyproject.toml(Pythonプロジェクト設定)
name = “my-app” version = “0.1.0”
Hugo:
# config.toml(静的サイトジェネレーター設定)
baseURL = "https://example.com"
languageCode = "ja"
title = "My Website"
その他、Docker Compose、Netlify、GitHub Actionsなど、様々な場面で使われていますね。
基本的な文法
TOMLの書き方を見ていきましょう。
キーと値のペア
最も基本的な形式です。
title = "TOMLの例"
port = 8080
debug = true
ルール:
キー = 値の形式- 空白は無視される
- キーは英数字、アンダースコア、ハイフンが使える
コメント
# これはコメントです
title = "My App" # 行末コメントも可能
#記号でコメントを書けます。
データ型
TOMLでサポートされているデータ型を見ていきましょう。
文字列(String)
基本的な文字列:
name = "太郎"
message = "こんにちは、世界!"
複数行文字列:
description = """
これは複数行の
文字列です。
改行も保持されます。
"""
リテラル文字列(エスケープなし):
# 通常の文字列(エスケープあり)
path = "C:\\Users\\Name\\file.txt"
# リテラル文字列(エスケープなし)
path = 'C:\Users\Name\file.txt'
シングルクォートを使うと、バックスラッシュをエスケープする必要がありません。
整数(Integer)
age = 30
negative = -42
large_number = 1_000_000 # アンダースコアで読みやすく
異なる基数:
hex = 0xDEADBEEF # 16進数
octal = 0o755 # 8進数
binary = 0b11010110 # 2進数
浮動小数点数(Float)
pi = 3.14159
exponential = 5e+22
negative = -0.01
特殊な値:
infinity = inf
negative_infinity = -inf
not_a_number = nan
真偽値(Boolean)
enabled = true
debug = false
小文字のtrueとfalseのみが有効です。
日時(Date and Time)
日時:
# オフセット付き日時
timestamp = 1979-05-27T07:32:00Z
local_time = 1979-05-27T07:32:00
# 日付のみ
date = 2024-01-15
# 時刻のみ
time = 07:32:00
ISO 8601形式に準拠しています。
配列(Array)
同じ型の値を並べて保存できます。
基本的な配列
colors = ["red", "green", "blue"]
numbers = [1, 2, 3, 4, 5]
mixed = ["text", 42, true] # 異なる型も可能
複数行の配列
contributors = [
"Alice",
"Bob",
"Charlie",
]
末尾のカンマ(trailing comma)が許可されています。
ネストした配列
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
テーブル(Table)
TOMLの最も重要な機能の一つです。
基本的なテーブル
[server]
host = "localhost"
port = 8080
debug = true
[テーブル名]で新しいセクションを定義します。
ネストしたテーブル
ドット記法:
[database.connection]
host = "localhost"
port = 5432
username = “admin” password = “secret”
または階層的に:
[database]
name = "mydb"
host = “localhost” port = 5432
インラインテーブル
point = { x = 10, y = 20, z = 30 }
person = { name = "太郎", age = 30 }
一行で書きたい場合に便利です。
テーブル配列(Array of Tables)
複数の同じ構造を持つデータを表現できます。
基本的な書き方
[[users]]
name = "Alice"
email = "alice@example.com"
[[users]]
name = "Bob"
email = "bob@example.com"
[[users]]
name = "Charlie"
email = "charlie@example.com"
[[テーブル名]]で配列の要素を追加します。
ネストした例
[[products]]
name = "Laptop"
price = 1200
[[products.features]]
description = "16GB RAM"
[[products.features]]
description = "512GB SSD"
[[products]]
name = "Mouse"
price = 25
実用的な設定ファイル例
実際のプロジェクトで使える例を見てみましょう。
Webアプリケーションの設定
# config.toml
name = "My Web App"
version = "1.0.0"
environment = "production"
host = "0.0.0.0"
port = 8080 workers = 4
driver = "postgresql"
host = "localhost"
port = 5432
name = "myapp_db"
username = "postgres"
password = "secret"
pool_size = 10
level = "info"
file = "/var/log/myapp.log"
max_size = "100MB"
enable_api = true
enable_admin = false
enable_cache = true
[[cors.allowed_origins]]
origin = "https://example.com"
[[cors.allowed_origins]]
origin = "https://app.example.com"
Rustのパッケージ設定(Cargo.toml)
[package]
name = "my-rust-app"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]
edition = "2021"
description = "A sample Rust application"
license = "MIT"
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.0", features = ["full"] }
reqwest = "0.11"
criterion = "0.5"
opt-level = 3
lto = true
Python プロジェクト設定(pyproject.toml)
[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"
name = "my-python-app"
version = "1.0.0"
description = "A sample Python application"
authors = [ { name = "Your Name", email = "you@example.com" } ]
dependencies = [ "requests>=2.28.0", "click>=8.0.0", ]
dev = [ "pytest>=7.0", "black>=22.0", "mypy>=0.950", ]
line-length = 100
target-version = ['py39']
testpaths = ["tests"]
YAML、JSON、INIとの比較
他の設定ファイル形式との違いを見てみましょう。
構文の比較
TOML:
[server]
host = "localhost"
port = 8080
[[users]]
name = "Alice"
age = 30
YAML:
server:
host: localhost
port: 8080
users:
- name: Alice
age: 30
JSON:
{
"server": {
"host": "localhost",
"port": 8080
},
"users": [
{
"name": "Alice",
"age": 30
}
]
}
INI:
[server]
host=localhost
port=8080
; INIでは配列の表現が難しい
特徴の比較
| 特徴 | TOML | YAML | JSON | INI |
|---|---|---|---|---|
| 可読性 | ◎ | ○ | △ | ○ |
| 簡潔性 | ○ | ◎ | △ | ◎ |
| 厳密性 | ◎ | △ | ◎ | △ |
| データ型 | 豊富 | 豊富 | 限定的 | 基本的 |
| コメント | ○ | ○ | × | ○ |
| 複雑な構造 | ○ | ◎ | ○ | △ |
どれを選ぶべき?
TOMLが向いている:
- 設定ファイル
- 人間が手で編集する必要がある
- 構造がそこまで複雑でない
YAMLが向いている:
- CI/CD設定(GitHub Actions、GitLab CIなど)
- Kubernetesマニフェスト
- 複雑なネスト構造
JSONが向いている:
- API通信
- プログラム間のデータ交換
- 厳密な型定義が必要
INIが向いている:
- 非常にシンプルな設定
- レガシーシステム
プログラミング言語での使用

各言語でTOMLを読み書きする方法です。
Python
import tomli # Python 3.11以降は標準ライブラリのtomlibを使用
# 読み込み
with open("config.toml", "rb") as f:
config = tomli.load(f)
print(config["server"]["host"])
print(config["server"]["port"])
# 書き込み(tomli_wを使用)
import tomli_w
data = {
"title": "My App",
"server": {
"host": "localhost",
"port": 8080
}
}
with open("output.toml", "wb") as f:
tomli_w.dump(data, f)
インストール:
pip install tomli tomli-w
Rust
use serde::Deserialize;
#[derive(Deserialize)]
struct Config {
server: Server,
}
#[derive(Deserialize)]
struct Server {
host: String,
port: u16,
}
fn main() {
let toml_str = r#"
host = “localhost” port = 8080 “#; let config: Config = toml::from_str(toml_str).unwrap(); println!(“Host: {}”, config.server.host); println!(“Port: {}”, config.server.port); }
Cargo.toml:
[dependencies]
toml = "0.8"
serde = { version = "1.0", features = ["derive"] }
JavaScript/Node.js
const toml = require('toml');
const fs = require('fs');
// 読み込み
const config = toml.parse(fs.readFileSync('config.toml', 'utf-8'));
console.log(config.server.host);
console.log(config.server.port);
// 書き込み(@iarna/toml を使用)
const tomlify = require('@iarna/toml/stringify');
const data = {
title: "My App",
server: {
host: "localhost",
port: 8080
}
};
fs.writeFileSync('output.toml', tomlify(data));
インストール:
npm install toml @iarna/toml
Go
package main
import (
"fmt"
"github.com/BurntSushi/toml"
)
type Config struct {
Server Server `toml:"server"`
}
type Server struct {
Host string `toml:"host"`
Port int `toml:"port"`
}
func main() {
var config Config
_, err := toml.DecodeFile("config.toml", &config)
if err != nil {
panic(err)
}
fmt.Println("Host:", config.Server.Host)
fmt.Println("Port:", config.Server.Port)
}
オンラインツール
TOMLを扱う便利なツールです。
バリデーター
TOML Lint:
TOMLファイルが正しい構文かチェックできます。
コンバーター
JSON to TOML:
JSONとTOML間で相互変換できますよ。
エディタ
VS Code拡張機能:
- “Better TOML”:シンタックスハイライトと検証
- “Even Better TOML”:さらに高機能
オンラインエディタ:
リアルタイムでJSONに変換しながら編集できます。
よくあるエラーと対処法
TOMLでよくあるミスと解決方法です。
エラー1:引用符の不一致
間違い:
name = "Alice' # ダブルとシングルが混在
正しい:
name = "Alice"
# または
name = 'Alice'
エラー2:キーの重複
間違い:
[server]
host = "localhost"
[server] # エラー:すでに定義済み
port = 8080
正しい:
[server]
host = "localhost"
port = 8080
エラー3:配列の型混在
間違い:
# TOMLでは配列内の型を混在できるが、推奨されない
mixed = [1, "two", true]
推奨:
# 同じ型に統一
numbers = [1, 2, 3]
strings = ["one", "two", "three"]
エラー4:日時の形式ミス
間違い:
date = 2024/01/15 # スラッシュは使えない
正しい:
date = 2024-01-15
エラー5:インラインテーブルの改行
間違い:
point = {
x = 10,
y = 20
}
正しい(インラインテーブル):
point = { x = 10, y = 20 }
または通常のテーブル:
[point]
x = 10
y = 20
ベストプラクティス
TOMLファイルを書く際の推奨事項です。
一貫した命名規則
# スネークケースを推奨
database_host = "localhost"
max_connections = 100
# キャメルケースも可能だが、一貫性を保つ
databaseHost = "localhost"
maxConnections = 100
コメントで説明を追加
# データベース接続設定
host = “localhost” # 本番環境では別のホストを指定 port = 5432 # PostgreSQLのデフォルトポート
セクションを論理的にグループ化
# サーバー関連の設定
host = “0.0.0.0” port = 8080
enabled = true cert = “/path/to/cert.pem” key = “/path/to/key.pem” # データベース関連の設定
driver = “postgresql” host = “localhost”
環境別の設定ファイル
config/
├── base.toml # 共通設定
├── development.toml # 開発環境
├── staging.toml # ステージング環境
└── production.toml # 本番環境
センシティブ情報の扱い
# 悪い例:パスワードを直接書く
password = “secret123” # 良い例:環境変数を参照(アプリ側で処理)
password = “${DATABASE_PASSWORD}”
よくある質問
Q: TOMLとYAML、どちらを選ぶべき?
A: 設定ファイルで人間が頻繁に編集するならTOMLが読みやすくておすすめです。CI/CDやKubernetesなど複雑な構造が必要ならYAMLが向いていますね。
Q: TOMLファイルのバージョン管理は?
A: TOMLファイルはテキストなので、Gitなどで通常通りバージョン管理できます。ただし、パスワードなどのセンシティブ情報は.gitignoreで除外しましょう。
Q: TOML v1.0とそれ以前の違いは?
A: 2021年にTOML 1.0.0が正式リリースされ、仕様が安定しました。それ以前のバージョンとの互換性はほぼありますが、細かい挙動が変わっている場合があります。
Q: TOMLはXMLの代わりになる?
A: 目的が違います。TOMLは設定ファイル向けで、XMLはドキュメント記述やデータ交換に向いています。設定ファイルならTOMLの方が圧倒的に読みやすいですよ。
Q: TOMLでバイナリデータは扱える?
A: 直接は扱えません。Base64エンコードした文字列として保存する必要があります。大きなバイナリデータには向いていませんね。
まとめ:TOMLで分かりやすい設定を
TOMLについて、重要なポイントをおさらいします。
今日学んだこと:
- TOMLは人間が読み書きしやすい設定ファイル形式
- Tom Preston-Werner氏が開発
- Rust、Python、Goなど多くの言語で採用
- キーと値、テーブル、配列が基本構造
- 文字列、整数、浮動小数点、真偽値、日時をサポート
- YAMLやJSONと比べて明確で曖昧さがない
- パーサーライブラリが各言語で利用可能
- 設定ファイルに最適
TOMLは、設定ファイルを書く上で非常に優れた選択肢です。
YAMLのようにインデントで混乱することもなく、JSONのように読みにくくもなく、INIのように機能不足でもありません。特にRustやPythonの開発をするなら、TOMLは避けて通れない存在ですね。
まずは小さなプロジェクトの設定ファイルをTOMLで書いてみて、その読みやすさを体験してみてください。一度使えば、その明確さと使いやすさにきっと感動するはずですよ!

コメント