環境どうしの同期
ステージングで組んだデザインを本番へ反映するとき、一番時間がかかるのは 反映そのものではなく、どこが違うのかを突き止めることです。
mtb dump は接続先の MT の内容を種類ごとの YAML に書き出すので、あとは 通常の diff で比較できます。
mtb dump --profile stg --dir ./dump/stg
mtb dump --profile prod --dir ./dump/prod
diff -ru ./dump/prod ./dump/stg--- ./dump/prod/sites/SaasHub/templates.yaml
+++ ./dump/stg/sites/SaasHub/templates.yaml
@@ -60,6 +60,8 @@
</mt:If>
+
+ <!-- ステージングで足した行 -->
type: custom何が出るか
dump/
├── system/ ロール・利用者・グループ+サーバの素性
└── sites/<サイト名>/ テンプレート・カテゴリ・フォルダ・カテゴリセット・
コンテンツタイプ・カスタムフィールド・ウィジェット・
整形済みテキスト・記事・ページ・アセット統計・ログ・コメントは対象外です(環境で違って当たり前のものです)。
何を書き出さないか
ID・時刻・作成者・permalink は書き出しません。 環境ごとに違うので、 書き出すと中身が同じでも全行が差分になります。
- 並べ替えと突き合わせには
basename/name/labelなどの自然キーを使います。 ID では突き合わせません。 ステージングの記事 42 と本番の記事 42 は別の記事です - 他のオブジェクトへの参照も自然キーに置き換えます(記事の categories は basename の配列)
- 階層のあるカテゴリ・フォルダは、親をルートからのパスで記録します
- 受け側の MT が生成する値も書き出しません。
uniqueID(環境ごとに生成される)とfileSize(MT は JPEG を取り込むときに再エンコードする)は、書き出すと いつまでも消えない差分になります
複数行はリテラルブロック(|)で書きます。 テンプレート本文は千行を 超えることがあり、1行の文字列にすると差分が「1行変わった」としか出ません。 行末の空白やタブを含む文字列は引用符付きの文字列で書くので、書き出しても中身は変わりません。
同じ入力からは必ず同じバイト列を出力します。 そのため、diff に出たものは実際の差分です。
サイト設定は2つに分かれます
| ファイル | 中身 |
|---|---|
site.yaml | 運ぶべき設定 |
site-environment.yaml | host sitePath など運んではいけないもの |
1つのファイルに混ぜると「差分だが運んではいけない」行が紛れ込み、運ぶかどうかを判断できなくなります。
サーバの素性も記録します
環境間で運べるものではありませんが、違いが分かるだけでも役に立ちます。
| なぜ要るか | |
|---|---|
plugins.yaml | 無いプラグインに依存したテンプレートは公開時にエラーになります(ブロックエディタもプラグイン) |
text-filters.yaml | format: markdown の記事は、その書式が無い MT では読めません |
endpoints.yaml | その MT に無い機能は、呼び出した時点で 404 になります |
server.yaml | API のバージョン |
アセットの中身まで見る
アセットはサイトルートからの相対パスで記録します。中身まで突き合わせるなら --asset-hash を付けてください(MD5 を記録します。1ファイルにつき1リクエスト増えます)。
API から読めないもの
mt-config.cgi は API から読めません
次のものは差分に出ないので、移行の前に人が手作業で合わせる必要があります。
EmailAddressMain: 未設定だとメール送信が 500 になりますDeniedAssetFileExtensions:.js.htmlが上げられない理由ですDefaultLanguage
カスタムブロック(be_block)も差分に出ません。 Data API に エンドポイントが無いためです。運ぶ手段はテーマだけです。
反映のしかた
差分を読んだあとは、変更するものを決めてから反映します。丸ごと上書きする手段は 用意していません(丸ごと上書きすると、テーマの適用と同じく破壊的な操作になります)。
| 差分の種類 | 反映のしかた |
|---|---|
| テンプレート | sites templates push、または templates update |
| カテゴリ・フォルダ | sites categories create / update |
| カスタムフィールド | sites fields create / update |
| コンテンツタイプ | sites content-types create / fields create |
| 器ごと | テーマの適用(総入れ替え) |
Claude Code では /mtb-migrate で、この流れ(両方をダンプ → 差分を出す → 計画を人間と合意する → 反映する → 確かめる)を進められます。