TOML完全ガイド:設定ファイルを人間が読める形で書く【初心者向け】

プログラミング・IT

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

小文字のtruefalseのみが有効です。

日時(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では配列の表現が難しい

特徴の比較

特徴TOMLYAMLJSONINI
可読性
簡潔性
厳密性
データ型豊富豊富限定的基本的
コメント×
複雑な構造

どれを選ぶべき?

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 Lint - The TOML Validator
Validate and Verify your TOML files (Tom's obvious minimal language)

TOMLファイルが正しい構文かチェックできます。

コンバーター

JSON to TOML:

JSON to TOML
An online playground to convert JSON to TOML

JSONとTOML間で相互変換できますよ。

エディタ

VS Code拡張機能:

  • “Better TOML”:シンタックスハイライトと検証
  • “Even Better TOML”:さらに高機能

オンラインエディタ:

https://toml-to-json.orchard.blog

リアルタイムで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で書いてみて、その読みやすさを体験してみてください。一度使えば、その明確さと使いやすさにきっと感動するはずですよ!


コメント

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