TOMLとは?Rustの設定ファイルで使われる注目フォーマットを解説

プログラミングをしていると、「設定ファイルの書き方が複雑で分かりにくい…」と感じたことはありませんか?

そんな悩みを解決するために生まれたのがTOML(トムル)という設定ファイルフォーマットです。

この記事では、Rust言語の設定ファイルなどで広く採用されているTOMLについて、初心者の方にも理解できるように丁寧に解説していきます。設定ファイルをもっと読みやすく、書きやすくしたい方は必見ですよ!

スポンサーリンク
  1. TOMLの基本:名前の由来と意味
    1. 開発者について
  2. なぜTOMLが必要だったのか?
    1. 既存フォーマットの課題
    2. TOMLが目指したもの
  3. TOMLの基本的な書き方
    1. キーと値の基本
    2. データ型
    3. テーブル(セクション)
    4. ネストしたテーブル
    5. 配列テーブル
  4. 文字列の書き方:4つのスタイル
    1. 1. 基本文字列(ダブルクォート)
    2. 2. リテラル文字列(シングルクォート)
    3. 3. 複数行文字列(トリプルダブルクォート)
    4. 4. 複数行リテラル文字列(トリプルシングルクォート)
  5. 実際の使用例
    1. 例1:Rustのプロジェクト設定(Cargo.toml)
    2. 例2:Pythonのプロジェクト設定(pyproject.toml)
    3. 例3:アプリケーションの設定ファイル
  6. 他のフォーマットとの比較
    1. 同じ設定を4つのフォーマットで
    2. それぞれの特徴
  7. TOMLのメリット
    1. 1. 読みやすく、書きやすい
    2. 2. データ型が明確
    3. 3. コメントが書ける
    4. 4. 標準仕様がある
    5. 5. 多くのプログラミング言語で対応
  8. TOMLのデメリット
    1. 1. 大規模なデータには向かない
    2. 2. 深いネスト構造は書きにくい
    3. 3. 配列の中にテーブルを入れるのが少し複雑
  9. TOMLのツールとライブラリ
    1. オンライン検証ツール
    2. エディタのサポート
    3. プログラミング言語別のライブラリ
  10. よくある疑問に答えます
    1. Q. TOMLとYAML、どちらを選ぶべき?
    2. Q. JSONから移行する価値はある?
    3. Q. TOMLは今後も使われ続ける?
    4. Q. 学習コストはどれくらい?
  11. まとめ:設定ファイルの新しい選択肢

TOMLの基本:名前の由来と意味

TOMLは「Tom’s Obvious, Minimal Language(トムの分かりやすくてシンプルな言語)」の略称です。

名前の由来を見てみましょう:

  • Tom’s → 開発者のTom Preston-Werner氏の名前から
  • Obvious → 一目で分かる、明白な
  • Minimal → 最小限の、シンプルな
  • Language → 言語、記述形式

つまり、「誰が見ても分かる、最小限の記述で設定を書ける言語」というコンセプトで作られたんです。

開発者について

TOMLは、GitHubの共同創設者であるTom Preston-Werner氏が2013年に開発しました。彼は「設定ファイルは人間が読み書きしやすくあるべき」という思想のもと、TOMLを設計したんですね。

なぜTOMLが必要だったのか?

設定ファイルのフォーマットには、すでにJSON、XML、YAML、INIなど、たくさんの選択肢がありました。それなのに、なぜ新しいフォーマットが必要だったのでしょうか?

既存フォーマットの課題

JSON(JavaScript Object Notation):

  • コメントが書けない
  • 末尾のカンマを許容しない
  • 人間が読み書きするには少し複雑

YAML(YAML Ain’t Markup Language):

  • インデントが厳密すぎる
  • 複雑な仕様で、予期しない挙動がある
  • パーサーによって解釈が異なることも

INIファイル:

  • 標準仕様がない
  • データ型が曖昧
  • ネストした構造が書きにくい

TOMLが目指したもの

これらの課題を解決するため、TOMLは以下を目指しました:

  • 明瞭さ:設定の意味が一目で分かる
  • シンプルさ:最小限のルールで書ける
  • 型安全性:データ型が明確
  • 人間にやさしい:直感的に読み書きできる

TOMLの基本的な書き方

拡張子は「.toml」を使います。

キーと値の基本

最もシンプルな書き方は、キーと値をイコール(=)で結ぶ形式です。

# コメントはシャープ記号で書きます
title = "TOMLの例"
version = "1.0.0"
enabled = true
port = 8080

ポイント:

  • キーと値は=で結ぶ
  • 文字列はダブルクォート(”)で囲む
  • コメントは#で始める

データ型

TOMLは、明確なデータ型を持っています。

サポートされる型:

# 文字列
name = "山田太郎"
description = "これは説明文です"

# 整数
age = 25
port = 8080

# 浮動小数点数
price = 99.99
temperature = -12.5

# 真偽値
enabled = true
debug_mode = false

# 日付と時刻
created_at = 2025-01-15T10:30:00Z
birthday = 1990-05-20

# 配列(リスト)
colors = ["red", "green", "blue"]
numbers = [1, 2, 3, 4, 5]

# 複数行にわたる配列も書ける
fruits = [
  "apple",
  "banana",
  "orange"
]

テーブル(セクション)

設定を階層的に整理するには、テーブルを使います。

# [テーブル名]でセクションを定義

host = “localhost” port = 5432 username = “admin” password = “secret”

host = “0.0.0.0” port = 8080 timeout = 30

結果のイメージ:

database:
  host = "localhost"
  port = 5432
  username = "admin"
  password = "secret"

server:
  host = "0.0.0.0"
  port = 8080
  timeout = 30

ネストしたテーブル

ドット(.)を使って、階層を深くできます。

[database.connection]
host = "localhost"
port = 5432

min_size = 5 max_size = 20

port = 8080 timeout = 30

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

または、インライン形式でも書けます:

database = { host = "localhost", port = 5432, username = "admin" }

配列テーブル

同じテーブルを複数定義したい場合は、配列テーブルを使います。

[[products]]
name = "商品A"
price = 1000
in_stock = true

[[products]]
name = "商品B"
price = 2000
in_stock = false

[[products]]
name = "商品C"
price = 1500
in_stock = true

ダブルブラケット[[...]]を使うと、配列の要素として扱われます。

文字列の書き方:4つのスタイル

TOMLでは、文字列を4つの方法で書けます。

1. 基本文字列(ダブルクォート)

message = "Hello, World!"
path = "C:\\Users\\yamada\\Documents"

バックスラッシュでエスケープできます。

2. リテラル文字列(シングルクォート)

regex = '\d+\.\d+'
windows_path = 'C:\Users\yamada\Documents'

エスケープが不要なので、正規表現やWindowsパスに便利です。

3. 複数行文字列(トリプルダブルクォート)

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

4. 複数行リテラル文字列(トリプルシングルクォート)

code = '''
def hello():
    print("Hello")
    return True
'''

エスケープ不要で、コードをそのまま書けます。

実際の使用例

例1:Rustのプロジェクト設定(Cargo.toml)

TOMLが最もよく使われるのが、Rustのパッケージマネージャー「Cargo」の設定ファイルです。

[package]
name = "my-app"
version = "0.1.0"
edition = "2021"
authors = ["山田太郎 <yamada@example.com>"]
description = "サンプルアプリケーション"
license = "MIT"

serde = “1.0” tokio = { version = “1.0”, features = [“full”] } actix-web = “4.0”

mockall = “0.11”

opt-level = 3 lto = true

ポイント:

  • プロジェクトの基本情報を[package]に記述
  • 依存ライブラリを[dependencies]に列挙
  • ビルド設定も分かりやすく記述できる

例2:Pythonのプロジェクト設定(pyproject.toml)

Pythonでも、新しいパッケージ管理ツール(Poetry、PDMなど)でTOMLが採用されています。

[tool.poetry]
name = "my-python-app"
version = "0.1.0"
description = "Pythonアプリケーション"
authors = ["山田太郎 <yamada@example.com>"]

python = “^3.9” django = “^4.0” requests = “^2.28”

pytest = “^7.0” black = “^22.0”

requires = [“poetry-core>=1.0.0”] build-backend = “poetry.core.masonry.api”

例3:アプリケーションの設定ファイル

独自アプリケーションの設定にも使えます。

# アプリケーション基本設定

name = “MyWebApp” version = “2.1.0” environment = “production” # データベース設定

host = “db.example.com” port = 5432 name = “myapp_db” username = “dbuser” max_connections = 50

host = “db-replica.example.com” port = 5432 # ログ設定

level = “info” output = “/var/log/myapp.log” max_size = “100MB” rotation = “daily” # サーバー設定 [[servers]] name = “web-1” host = “192.168.1.10” port = 8080 [[servers]] name = “web-2” host = “192.168.1.11” port = 8080 # 機能フラグ

enable_cache = true enable_debug = false enable_analytics = true

他のフォーマットとの比較

実際に同じ設定を、それぞれのフォーマットで書き比べてみましょう。

同じ設定を4つのフォーマットで

設定内容:

  • アプリ名:MyApp
  • バージョン:1.0.0
  • ポート:8080
  • デバッグモード:有効

TOML:

[app]
name = "MyApp"
version = "1.0.0"
port = 8080
debug = true

JSON:

{
  "app": {
    "name": "MyApp",
    "version": "1.0.0",
    "port": 8080,
    "debug": true
  }
}

YAML:

app:
  name: MyApp
  version: 1.0.0
  port: 8080
  debug: true

INI:

[app]
name = MyApp
version = 1.0.0
port = 8080
debug = true

それぞれの特徴

フォーマット可読性データ型コメント複雑な構造学習コスト
TOML明確低い
JSON明確×低い
YAML明確高い
INI曖昧×非常に低い

TOMLの位置づけ:
INIの読みやすさと、JSONの明確さを兼ね備えたフォーマットと言えます。

TOMLのメリット

1. 読みやすく、書きやすい

設定の意味が一目で分かります。

プログラミングの経験が浅い人でも、直感的に理解できるんです。

2. データ型が明確

文字列、数値、真偽値などが明確に区別されます。

port = 8080      # これは数値
port = "8080"    # これは文字列

曖昧さがないため、予期しないエラーを防げます。

3. コメントが書ける

JSONと違い、コメントを自由に書けます。

# この設定は本番環境専用です
# 開発環境では異なる値を使用してください
database_host = "prod-db.example.com"

設定の意図や注意点を残せるのは、大きなメリットです。

4. 標準仕様がある

公式の仕様書(https://toml.io/)があり、パーサーの挙動が統一されています。

INIファイルのように「実装によって解釈が異なる」という問題がありません。

5. 多くのプログラミング言語で対応

主要な言語には、TOMLのパーサーライブラリが存在します。

  • Rust:標準的に使われている
  • Python:標準ライブラリ(tomllib)で対応
  • Go:複数のライブラリが利用可能
  • JavaScript/TypeScript:npmパッケージが豊富
  • Ruby、PHP、Java:各種ライブラリが存在

TOMLのデメリット

もちろん、完璧なフォーマットではありません。

1. 大規模なデータには向かない

TOMLは設定ファイル向けに設計されています。

大量のデータを扱う場合は、JSONやデータベースの方が適しています。

2. 深いネスト構造は書きにくい

階層が深くなると、記述が冗長になることがあります。

# 階層が深い場合

value = “deep”

このような場合は、YAMLの方が簡潔に書けるかもしれません。

3. 配列の中にテーブルを入れるのが少し複雑

配列テーブル[[...]]の記法に、最初は戸惑うかもしれません。

[[users]]
name = "Alice"
age = 30

[[users]]
name = "Bob"
age = 25

慣れれば問題ありませんが、学習コストは若干あります。

TOMLのツールとライブラリ

オンライン検証ツール

  • TOML to JSON Online Converter
  • TOMLをJSONに変換して確認できる
  • 構文エラーも検出してくれる

エディタのサポート

主要なエディタはTOMLに対応しています。

  • VS Code:TOML拡張機能が利用可能
  • IntelliJ IDEA:TOML pluginをインストール
  • Vim/Neovim:vim-tomlプラグイン
  • Sublime Text:TOML Syntax Highlighting

シンタックスハイライト(色分け表示)や、自動補完が使えます。

プログラミング言語別のライブラリ

Python:

import tomllib  # Python 3.11以降は標準ライブラリ

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

Rust:

# Cargo.toml

toml = “0.8”

JavaScript/TypeScript:

npm install @iarna/toml

よくある疑問に答えます

Q. TOMLとYAML、どちらを選ぶべき?

用途によります。

TOMLが適している場合:

  • 設定ファイル(アプリケーション、ビルドツールなど)
  • 人間が頻繁に編集する
  • データ型の明確さが重要

YAMLが適している場合:

  • CI/CD設定(GitHub Actions、GitLab CIなど)
  • 深いネスト構造が多い
  • 業界標準として定着している

Q. JSONから移行する価値はある?

設定ファイルとして使う場合は、検討の価値があります。

メリット:

  • コメントが書ける
  • 人間が読み書きしやすい
  • 末尾カンマを気にしなくていい

デメリット:

  • APIのレスポンスなどには向かない
  • 既存のJSON対応ツールが使えない

Q. TOMLは今後も使われ続ける?

少なくとも当面は使われ続けるでしょう。

理由:

  • Rustエコシステムで標準的に採用されている
  • Pythonの新しいツールでも採用が進んでいる
  • 公式仕様が安定している
  • コミュニティのサポートが活発

GitHubのスター数も多く、安心して使えるフォーマットです。

Q. 学習コストはどれくらい?

非常に低いです。

基本的な書き方は30分もあれば理解できます。INIファイルを書いたことがある人なら、ほとんど違和感なく使えるはずです。

まとめ:設定ファイルの新しい選択肢

TOMLは、読みやすく書きやすい設定ファイルフォーマットです。

重要ポイントをおさらい:

  • 人間が読み書きしやすいことを最優先に設計されている
  • データ型が明確で、予期しない動作を防げる
  • コメントが自由に書ける
  • Rustの標準設定ファイルとして広く使われている
  • 標準仕様があり、パーサーの挙動が統一されている
  • 主要なプログラミング言語でサポートされている
  • 設定ファイル用途に最適化されている

既存のJSON、YAML、INIに不満を感じている方は、TOMLを試してみる価値があります。

あなたの次のプロジェクトで、TOMLを使ってみてはいかがでしょうか?きっと設定ファイルの管理が快適になりますよ!

コメント

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