設定ファイル差分: INI、TOML、.env をオンラインで比較
2つの設定ファイルを並べて貼り付けると、どのキー、値、コメントが変更されたかを正確に確認できます。.env、TOML、INI、.properties、.conf に対応。
設定ファイル差分ツールとは?
設定ファイルを差分比較するための、無料のブラウザ内ツールです。左にステージングの .env、右に本番のものを貼り付けると、欠けているキー、変更された値、古くなったコメントがすぐに浮かび上がります。Poetry の更新前後の pyproject.toml、リロード直前の nginx.conf、環境間を移動する Java の application.properties でも同じ流れです。
差分は文字レベルです。パーサーもスキーマもなく、どの方言を貼り付けたかについての判断もしません。これは意図的です。設定ファイルは単一の文法を共有していません。INI には正式な仕様がなく、すべてのパーサーがクオートやエスケープについて意見が分かれます。TOML 1.0 は厳密な文法を持ちますが、型付き値が加わります。.env ファイルには仕様がまったくなく、dotenv やお使いのシェルがその時々で行うことに従うだけです。
プレーンな文章を求めて来られたなら、テキスト差分ツールが正解です。YAML 設定 (Kubernetes マニフェスト、Helm values、Ansible playbook) には YAML 差分を使ってください。JSON として出てくる設定 (VS Code の設定、npm の package.json、Terraform の tfstate) には、JSON 差分がオブジェクトの並び替えをテキスト差分よりきれいに扱います。
差分が実際にどう動くか
差分は文字レベルで動作し、その後の意味的な後処理パスでハイライトを移動させ、トークンの途中の雑音ではなく、キー全体、値全体、コメント行全体に当たるようにします。挿入は右ペインに緑、削除は左に赤で表示されます。各ヘッダーの変更カウンターは、アルゴリズムが見つけた異なる編集の数を示します。
設定形式は十分に多様で、単一のパーサーですべてに対応することはできないため、このツールは意図的にフォーマット非依存に保たれています。.env はその中で最もゆるく、ほとんどのローダーは右辺全体を文字列として扱いますが、$VAR を展開するものとしないもの、export を尊重するもの、空白を含む値の前後のクオート方法はパーサー依存です。.properties ファイル (Java の標準、java.util.Properties API に文書化) は = または : をセパレーターとして受け付け、ASCII 以外の文字には \u00e9 のような Unicode エスケープを要求します。実環境の INI ファイルは、Windows の慣習 (角括弧でセクション、セミコロンでコメント) から、Python の configparser モジュールが受け付けるわずかに異なる方言まで様々です。
差分がきれいに見えても信用する前に知っておきたい、現実の落とし穴が3つあります。1つ目は末尾の空白です。API_KEY=abc のような値で行末に余分な空白が入っていると、ほとんどのローダーにとっては別の文字列となり、差分は知らせてくれますが、人間が問題の空白に気づくことは稀です。2つ目は改行コードです。Windows で CRLF でコミットされたファイルと、Linux で LF で書かれたファイルは、内容が同じでも差分ではすべての行が変更されたように見えます。両側をフォーマットするか、改行を先に正規化してください。3つ目は UTF-8 のバイトオーダーマークです。Windows のメモ帳は今でも保存した .env の先頭に BOM を平気で書き込み、ほとんどのローダーがこれにつまずき、1行目に1文字のファントム差分として現れます。
設定ファイルを3ステップで比較
テキストペインが2つ、差分が1つ。アップロードもログも一切なし。
- 1
設定を貼り付けるかアップロード
古い設定を左に、新しい設定を右に貼り付けます。または、どちらかの側で Upload をクリックして、.env、.toml、.ini、.properties、または .conf ファイルを直接ロードします。Sample ボタンは両方のペインに小さな .env サンプルを入れてくれるので、自分のものを貼る前に、値の変更、新しいキー、削除されたエントリがどう描画されるかを確認できます。
- 2
フォーマットして正規化
各ペインの Format をクリックして、末尾の空白をトリミングし、改行コードを統一します。これは最も多い偽陽性のクラスを潰します。見た目は同じなのに、片方が CRLF で保存され、もう片方が LF で保存されているために完全に違うものとして差分が出るケースです。両側が空白について合意すれば、差分は本当のキーと値の変更に集中します。
- 3
差分を読む
削除は左に赤いハイライト、挿入は右に緑のハイライトで表示されます。どちらかをスクロールすると、もう一方も追従します。コメントとコメントアウトされたキーは通常のテキストとして差分が取られるので、# を先頭に付けて消したキーは、削除されたキーではなくコメント行が追加されたものとして表示されます。
設定差分が適しているとき
ローカルとステージングの .env を差分比較
フィーチャーブランチをローカルで立ち上げて問題なく動くのに、ステージングでは STRIPE_WEBHOOK_SECRET がステージングの .env から欠けていてクラッシュする。動作中のローカルファイルをステージング側のものと突き合わせて貼ると、欠けているキー、変わった DATABASE_URL ホスト、古い LOG_LEVEL=debug が一度に浮かび上がります。両ファイルを行単位で歩くより速く、両方の変数セットをターミナルに出力するスクリプトを動かすよりずっと安全です。
依存関係アップグレード後に pyproject.toml を比較
Poetry や uv が poetry update 後に pyproject.toml を書き換えたばかり。前のコミット版とワーキングツリーを差分にして、実際のアップグレードを確認します。fastapi が 0.110.0 から 0.115.4 へ移動、新しい [tool.ruff.lint] テーブルが出現、build-system.requires のピンが変わった、など。TOML 1.0 仕様は十分に厳密なので、差分は通常きれいで読みやすいです。
リロード前に nginx.conf の変更をレビュー
壊れた設定で nginx をリロードすると、サーバー上のほとんど何よりも早く本番サイトが落ちます。nginx -s reload の前に、稼働中の nginx.conf を提案版と突き合わせて貼り、変更が意図通りであることを確認してください。新しい upstream ブロック、更新された proxy_pass ターゲット、TLS 暗号スイートの入れ替え。差分は毎回、うっかり抜けたセミコロンを捕まえます。
systemd unit や supervisord 設定を監査
デプロイ後にサービスがループ再起動している。動作していた foo.service と新しいものを差分比較すると、たいてい30秒以内に原因が見つかります。ExecStart の変更、Environment= 行の脱落、NoNewPrivileges の締め付け、など。supervisord の .conf ブロック、runit の run-script、古いマシンで今でも見かける各種 .ini 風の init 設定でも同じ流れです。
インフラ as コードの設定ファイルを比較
terraform.tfvars の Terraform 変数、Pulumi のスタック設定、Ansible の group_vars、Kubernetes ConfigMap 用の Helm values。各環境にそれぞれのコピーがあり、安全にマージする唯一の方法は差分です。本番をステージングと突き合わせて貼ると、ドリフトが浮かび上がります。一方は us-east-1 でリージョンがピンされ、もう一方は us-west-2、誰かがインシデント中に上げて戻し忘れたインスタンスタイプ、間違ったアカウントを指している IAM role ARN、など。
CI 環境ファイルがドキュメント化されたテンプレートに合致するか確認
新しいエンジニアが入り、リポジトリから .env.example をコピーするのに、テンプレートが CI パイプラインの実際の期待からずれているために最初の PR でビルドが失敗する。コミットされた .env.example をビルドが通る誰かの既知の良好な .env と差分にすれば、欠けているキーは左に赤、または右に緑として現れます。同じトリックは Taskfile の env ブロック、GitHub Actions の env: セクション、direnv の .envrc ファイルでも使えます。
設定形式クイックリファレンス
このツールが最もよく扱う形式の短いカンニングペーパー。設定はその評判が示唆するよりも雑然としており、以下の違いはほとんどの差分が脱線するポイントです。
| Topic | What this tool does |
|---|
| 形式の方言 | INI (正式仕様なし、パーサーごとの方言)、TOML 1.0 (厳密、型付き)、.env (仕様なし、パーサー定義)、.properties (Java、java.util.Properties 参照)、.conf (アプリごと: nginx、Apache、sshd_config はすべて違う)。 |
|---|
| コメント文字 | INI: ; または #。TOML: # のみ。.env: # のみ、ほとんどのローダーで行頭のみ。.properties: # または !。nginx .conf: # のみ。 |
|---|
| セクションヘッダー | INI と TOML は [section] を使います。TOML は [a.b.c] でネストしたテーブル、[[a]] でテーブルの配列を加えます。.env と .properties はフラットでセクションなし。nginx はヘッダーの代わりに { ... } ブロックを使います。 |
|---|
| 値の型 | TOML には型付き値があります: 文字列、int、float、bool、日付、配列、テーブル。INI、.env、.properties は文字列のみで、true や 42 のパース方法はアプリケーションが決めます。 |
|---|
| 補間と展開 | ほとんどの dotenv ローダーはデフォルトでは $VAR を展開しません。一部 (dotenv-expand、direnv、source .env 経由のシェル sourcing) は展開します。TOML は決して展開しません。INI は展開することは稀。Python の configparser はオプトインすると ${section:key} をサポートします。 |
|---|
| 末尾空白 | 本物のバグの源。FOO=bar の末尾に空白があると、ほとんどのローダーで FOO が "bar " に設定され、下流の文字列等価チェックで失敗します。常にトリミングするかクオートしてください。 |
|---|
| 改行コード | CRLF (Windows) 対 LF (Unix)。同一の2ファイルが異なる OS で保存されると、全行変更として差分が出ます。差分前に Format ボタンを使うか、改行を正規化 (dos2unix、git config core.autocrlf) してください。 |
|---|
| エンコーディングと BOM | TOML は UTF-8 を必須とします。.properties は歴史的に \uXXXX エスケープ付きの ISO-8859-1 を要求していましたが、現代の Java は Properties.load(Reader) 経由で UTF-8 を受け付けます。.env 先頭の UTF-8 BOM は古典的なファントム差分の原因。Windows のメモ帳は今でもデフォルトで書き込みます。 |
|---|
設定差分: よくある質問
ツールは値の型を理解しますか?
いいえ。これはテキスト差分です。TOML は文字列、整数、浮動小数、真偽値、日付、配列を区別しますが、差分は各行をプレーンテキストとして扱い、どの文字が変わったかを示します。設定の変更はもともと文字の変更なので、たいていはこれで十分です。本当に型付き比較が必要な場合は、お好みの言語 (Python の tomllib、Rust の toml クレート、Go の pelletier/go-toml) で両方のファイルをパースし、得られたマップを比較してください。95%のケースでは、テキスト差分で必要なものは捕まえられます。
コメントアウトされた行が「異なる」ものの等価な場合、どう扱いますか?
たいていは扱いません。むしろツールが知らせてくれて良かったと思うべきです。API_KEY=abc から #API_KEY=abc への行変更は意味的に重要です。キーが今は無効化されています。差分はコメントプレフィックスの変更を強調表示しますが、これはまさに人間のレビュアーが設定レビュー中に見るべきものです。本当にコメントの変動を無視したいなら、貼る前に両側をフォーマットしてコメントのみの行を落としてください。ただしセキュリティに関連するファイルでは、これが正しい一手であることは稀です。
片方にキーが欠けているかをどう確認しますか?
両方のファイルを貼って差分を実行すると、片側にあって反対側にないキーは、行全体の赤い削除または緑の挿入として現れます。差分はキーを構造的に揃えようとしないので、別の位置に並び替えられたキーは、削除1回と挿入1回として現れます。完全に順序非依存の比較には、まず両方のファイルをキーでソート (Unix なら sort .env) してから差分を取ります。フォーマット非依存のアプローチは、パーサーなしでも欠けているキーを捕まえます。
本物のシークレットを含む .env を貼っても安全ですか?
はい、入力はブラウザから出ません。差分は完全にクライアント側で動作します。サーバーへのアップロードもなく、いずれかのペインの内容についてのテレメトリもなく、入力したものを取得するアナリティクスもありません。これは意図的で、.env の差分はこのサイトで最も信頼を要するワークフローの1つだからです。心配性なら (少しは心配性であるべきです)、ブラウザの devtools を開いて、貼り付け中にネットワークタブが空のままであることを確認してください。完全にエアギャップされたツールを好む組織なら、サイトを一度オフラインで開けば、キャッシュされたアセットがそれ以上のネットワークアクセスなしで動作します。
TOML と INI の違いは何ですか?
INI は慣習で、TOML は仕様です。INI は Windows で育ち、正式な文法はなく、各パーサーがエッジケース (クオート、エスケープ、リスト値、ネストされたセクション) をわずかに異なって扱います。TOML 1.0 は厳密でバージョン管理された仕様で、Cargo、Poetry、Hugo、そしてますます pyproject.toml を介した Python パッケージングで使われています。両方とも [section] ヘッダーと key = value ペアを使うので一見似て見えますが、TOML は型付き値、日時リテラル、インラインテーブルを加え、これらは古典的な INI ファイルにはありません。
差分はキーの大文字小文字や空白を正規化しますか?
いいえ。API_KEY=abc と api_key=abc は差分にとっては別の行です。バイトが違うからです。ほとんどのローダーも大文字小文字を区別する (dotenv、java.util.Properties、デフォルトの configparser) ので、これは現実に即しています。= の周りの空白はそのまま保持されます。これは重要で、より厳格なパーサーのいくつか (特に一部の Bash sourcing パターン) は、空白付きの FOO = bar を拒否し、FOO=bar しか受け付けません。Format ボタンは各行の末尾の空白をトリミングしますが、それが適用される唯一の正規化ステップです。
プライバシーと仕組み
設定ファイルがブラウザを離れることはありません。差分、フォーマッター、入力のすべてのバイトはローカルのマシンに留まります。ペインの内容についてのアナリティクスもログもアップロードもありません。.env ファイルにはデータベースのパスワード、API キー、OAuth クライアントシークレットが日常的に含まれており、それをサーバー経由で往復させるツールに貼ることは本物のセキュリティインシデントになるため、ここではほとんどの差分ツール以上にこれが重要です。形式の背景資料: TOML 1.0、INI ファイル、Unix の 環境変数の概念。そもそもファイルに置くべきでないシークレットには、sops、HashiCorp Vault、AWS Parameter Store を検討してください。