ビルド(Build)
Riebeckiteがコンテンツを処理し、公開先を解決し、プラグインを実行して、マニフェストとコンテンツグラフを組み立て、出力を書き出す一連の処理です。
ビルドの流れ
- 設定とプラグインを解決する
- Markdownなどのコンテンツを読み込む
- プラグインによる変換を実行する
- 公開するページとリンクを決める
- サイト全体の情報と必要なアセットを集める
- 画像やブラウザ側のコードなどのアセットを書き出す
- HonoXでサイトをビルドする
フルビルドと増分ビルド
--fullを使うと、前回のビルド情報を使わずにすべてを処理します。
増分ビルドは前回のビルド結果を再利用し、変更された部分だけを処理します。
前回のビルド情報は.riebeckite/build/content-state.jsonに保存されます。
ビルド状態
ビルド状態はアプリケーション単位で.riebeckite/build/content-state.jsonに保存されます。これは最適化のための情報であり、正となるデータではありません。状態が欠落しているか、非互換か、安全でない場合は、初期化またはフルビルドの経路に入ります。状態はビルドが成功したあとにだけ保存されるため、失敗しても以前の有効な状態は残ります。
パイプラインの段階と出力の生成
ビルドは、コンテンツの読み込みからHTMLの出力までを、packages/core/src/pipeline.tsで定義された一連のパイプライン段階で処理します。全体はpackages/core/src/content/content_build_coordinator.tsのContentBuildCoordinatorが調整します。
-
設定とプラグインの解決:
resolveConfigがsite、content、theme、plugins、cacheの既定値を検証してマージします。プラグインはprovides/requires/optionalのケイパビリティに基づいてresolvePluginsで順序付けられます。 -
コンテンツの読み込み:コンテンツソース(
FileSystemContentSourceなど)がコンテンツディレクトリからMarkdownファイルを読み込みます。 -
Markdownの解析とプラグインによる変換:
Pipelineクラスがunifiedプロセッサを実行します。remarkプラグインはparse、frontmatter、GFM、math、独自のremarkPluginsを担当し、rehypeプラグインはraw、slug、katex、format、stringify、独自のrehypePluginsを担当します。プラグインのextendMarkdownPipelineとextendHtmlPipelineフックを使うと、プラグインごとにパイプラインを拡張できます。 -
frontmatterの抽出とコンテンツ処理:frontmatterは
matter/vfile-matterで抽出します。処理済みコンテンツは、slug、source、frontmatter、パイプラインのフィンガープリントからなるキーで永続コンテンツキャッシュに保存されることがあります。依存関係はプラグインのdependencyMode(none/tracked/global/unsafe)に従って追跡します。 -
公開判定と公開先の解決:公開状態は
isPublishableが決めます。設定されたpublishStrategy(explicit/selective)とfrontmatterのpublish、private、draftを使います。パーマリンクはコンテンツの公開先リゾルバーが解決します。 -
マニフェストとグラフの構築:
ContentManagerがマニフェストのエントリを構築し、リンクを解決し、被リンク・発リンクの問い合わせ用にコンテンツグラフ(ContentGraph)を組み立てます。タグ、シリーズ、アーカイブのコレクションはbuildContentCollectionsが構築します。 -
出力の生成:画像やクライアントエントリなどのアセットを収集します。HTMLは解決済みのテーマを使ってSSG(HonoX)で出力します。
.riebeckite/build/content-state.jsonの前回のビルド状態により、変更されたコンテンツと再利用できる出力を追跡して増分ビルドを行えます。
パイプラインの実行
packages/core/src/pipeline.tsのPipelineクラスは、execute()で各コンテンツエントリを処理します。まずpackages/core/src/content/content_persistent_cache.tsの永続コンテンツキャッシュを、slug、source、frontmatter、パイプラインのフィンガープリントからなるキャッシュキーで確認します。キャッシュにヒットし、無効な依存関係がなければ、キャッシュ済みのfrontmatterとHTMLがすぐに返されます。キャッシュミスまたはバイパスの場合は、RemarkとRehypeのプラグインによる解析、frontmatterの抽出、GFM、math、独自の変換を経てMarkdownを処理します。リンクの解決はコンテンツ依存関係トラッカーを通じて依存関係を記録します。処理後、結果は依存関係とフィンガープリントとともに永続コンテンツキャッシュへ保存され、以降の増分ビルドで使われます。
パイプラインのフィンガープリント(computePipelineFingerprint)は、プラグインの設定、コンテンツフィルター、互換性バージョンを取り込みます。キャッシュ可能かどうかはisPersistentlyCacheableが決め、各プラグインのprocessedContentCacheの取り決め(dependencyMode: none/tracked/global/unsafe)を確認します。
コンテンツキャッシュとの統合
.riebeckite/cache/content/v5の永続コンテンツキャッシュは、エントリごとのMarkdown処理結果を保存します。キャッシュキーは、slug、source、正規化されたfrontmatter、パイプラインのフィンガープリントを含むCacheKeyInputsからcomputeContentCacheKeyで計算します。スキーマバージョン(CONTENT_CACHE_SCHEMA_VERSION、現在は5)が一致しないエントリはミスとして扱われ、再処理されます。キャッシュは論理的なコンテンツ、ファイル、リンクの依存関係(CachedContentDependency)を記録し、以降のビルドで無効化の判定に使います。キャッシュデータはワークスペースのパスではなく論理的なslugと正規化されたソースパスを含むため、同じオペレーティングシステム上の別のランナーやワークスペースへコピーできます。