Smart Content Dependency Management™の概要
抽象画
スマート・コンテンツ依存性管理™は、コンテンツ正規化原則に忠実でありながら、インクリメンタル・ビルドのサポートとファシリテーションの提供に関連するアイデアの円周です— についてパーマリンク コンテンツがソース・ツリー全体でどのようにキュレーションされ、結果のビルド・アーティファクトであっても、信頼できる唯一の情報源である必要があります。
この記事は、https://sunstarsys.com/ 関連するグラフトポロジのベストプラクティスと分析のデモのためのケーススタディとしてのウェブサイト。
注意事項
これは、Webページ上のコンテンツを微調整する必要があるたびに、フルサイトの構築にかかる費用を比較検討する必要がある場合にのみ重要です。Webサイトのソース・ファイルが1K未満の場合はrelax、将来のニーズに注意して次をお読みください。あなたは私たちのプラットフォームを使用することを選択しました、それは’あなたに対してではなく、あなたに対して拡張するように設計されました。ほとんどのページでは、次の資料は、1Kページを超えるサイトの疎コンテンツ依存性グラフについてです。
例えば、The Apache https://www.OpenOffice.Org ウェブサイトは、このビルドシステムの元のApacheバージョンを使用して40K+ファイルを構築することができ、増分ビルドを完全に統合しました— 構成された依存関係がない— 従来のSSIテクノロジーだけを賢く利用する。
デフォルトでは、ビルド・システムでは、変更したファイルのみがビルドされ、ファイル内依存関係は考慮されません(指定しないかぎり)。%path:: 依存関係 — 以上が下)。変更したファイルがテンプレート/ またはライブラリ/ 代わりに、完全なサイトビルドがトリガーされます。
Webサイトのウィービング’s 依存関係グラフ一緒に
数学的にトポロジ は、スペースのopenサブセットの完全指定ですの目的は、points間の近接関係を示すことです。 スペースについて。次の場合 グラフであるトポロジ 対象 グラフの頂点を接続するエッジを指定する量(ここでは、頂点はポイントとして表示されます) 、および接続エッジは、これらの点の近傍をトポロジのbasis open setsとして決定します。方向グラフ・トポロジは基本的に同じですが、位相埋込みへの参照が組み込まれています。 より大きな地質空間へ 『Where Embedding』’sエッジ接続は、方向非交差(ヨルダン)カーブで表されます。
後者の概念は、dependencyグラフを議論する際に利用するものである。’sトポロジ スペースに関連付けられている のソースファイルがサイトの下にあります’s コンテンツ/ サブディレクトリ 次である 次のメトリック・トポロジを使用します。のエッジと は、ファイルを接続する非交差、指示されたヨルダン曲線です ファイルのセットに対して 依存: ).
取得あなたのウェブサイトの明確な理解’sのdependencyグラフは私達の造りの技術の性能を大規模に最大にできます保障します。ご提供いただいた情報を%path:: 依存関係 ビルド中’あなたのウェブサイトの負荷’s lib/path.pm ファイル、依存ファイルの逆マップを構築し、その逆マップを使用して、任意の指定のために構築するファイルの完全なコーパスを決定しますsvnコミット あなたは私たちのシステムを作ります。
▲’ソース・ファイル間の依存関係は、%path:: 依存関係 ビルド・システム中のハッシュ’起動時の負荷lib/path.pm あなたのソースツリーから、私たちの中に含まれているビルトインビューSunStarSys:: ビュー Perlパッケージは動作します。▲walk_content_tree, アーカイブ済およびseed_file_deps インポート元のユーティリティ関数SunStarSys:: ユーティリティ は、%path:: 依存関係 大規模な増分ビルドを高速化するために依存関係キャッシュを管理するための組み込みのサポートを備えたハッシュ。
こちら’『THAT PART OF OUR LIVE』lib/path.pm:
our (%dependencies, @acl);
# entries computed below at build-time, or drawn from the .deps cache file
walk_content_tree {
$File::Find::prune = 1, return if m#^/(images|css|editor\.md|js|fontawesome)\b#;
return if -d "content/$_";
seed_file_deps, seed_file_acl if /\.(?:md|ya?ml)[^\/]*$/;
for my $lang (qw/en es de ru sv he zh-TW fr/) {
if (/\.md\.$lang$/ or m!/index\.html\.$lang$! or m!/files/|/slides/|/bin/!) {
push @{$dependencies{"/sitemap.html.$lang"}}, $_ if !archived;
}
if (s!/index\.html\.$lang$!!) {
$dependencies{"$_/index.html.$lang"} = [
grep s/^content// && !archived,
glob("'content$_'/*.{md.$lang,pl,pm,pptx}"),
glob("'content$_'/*/index.html.$lang")
];
push @{$dependencies{"$_/index.html.$lang"}}, grep -f && s/^content// && !m!/index\.html\.$lang!,
glob("'content$_'/*") if m!/files\b!;
}
}
}
and do {
while (my ($k, $v) = each %{$facts->{dependencies}}) {
push @{$dependencies{$k}}, grep $k ne $_, grep s/^content// && !archived, map glob("'content'$_"), ref $v ? @$v : split /[;,]?\s+/, $v;
}
open my $fh, "<:encoding(UTF-8)", "lib/acl.yml" or die "Can't open acl.yml: $!";
push @acl, @{Load join "", <$fh>};
};
あなたのウェブサイトをどのように動作させるかについてのアイデアのために、そのコードを引き渡してください。はい、いくつかの合理的な複雑さがあります(ペルーの両方を含む)’s正規表現とperl’s UNIX Cシェル地球儀 インターフェイス、非常に正確な方法) %path:: 依存関係 これは、そのファイルに構築されますが、最適化作業として表示するのではなく、動的に生成された自動化された方法でlinkトポロジ*の主要な側面を制約するために必要な基本成分を提供していることを確認してください。
エントリの場所%path:: 依存関係 起源? 発生していない場合は、walk_content_tree { seed_file_deps ... }、(これは基本的にマークダウン・ソース・ファイルにダイビングします)’ ヘッダーとコンテンツ)は、ハードコードされるだけです。lib/path.pm ロード時に。
循環依存関係グラフは標準
現在のサイトは、240ソースファイル 場所コンテンツ/。こちら’A 85頂点x 465エッジ当サイトに関する英語ページ依存関係の最新のスナップショットのスクロール可能な2次元指向グラフ表現(GraphVizの使用’s 点):
かなり複雑で、こんな小さなサイトでも! テイク時に多くのエッジ交差 (寸法は不可) ). 特に注記は、当社のサイト内の非アーカイブファイルにおける密で循環的な依存関係のコアセットです’s /essays/ ディレクトリ、グラフの右下中央に向かって、これは良いブログサイトです’s依存性グラフは次のようになります。これらの依存関係は、赤曲線 イメージで。
また、要素の内部で本質的に分離された相互接続性にも注意してください。/カテゴリ/*/* および/archives/2022/11/*。唯一の外部依存関係には、アーカイブされていないコンテンツが含まれます。/essays/*。これは設計によるものです— アーカイブされたエッセイは、おそらくそのエッセイの調整のためにのみadiabaticallyを変更する必要がありますカテゴリ ヘッダー。これらの変更は、既存のコンテンツに重大な影響を与えないため、’追跡する%path:: 依存関係.
もちろん、Orion Enterprise Wiki 循環依存に対処するのに苦労したことはない。
Isn’これはハイパーリンクのことですか?
*いいえ!*実際、Webサイトのリンク・トポロジ*はソース・ツリーとはまったく別の問題です’s 依存性グラフ 検索エンジンは、linkトポロジを自然に解き放ちますが、dependencyグラフ*に関する洞察はありません。
こちら’A 240以上の頂点x 3859エッジ当サイトの英語リンクトポロジグラフの現在の鳥目グラフGraphVizの使用’s トピックス):
見つけられるか赤いエッジ dependency graphで指定されている。リンク・トポロジグラフは、前述の(劇的に小さく、相互接続されていない)依存性グラフとは、定性的および定量的に**非常に異なります。
SSIテクノロジーがどのように役立つか
従来型サーバー側インクルード (SSI).
- あなたのウェブサイトをプルーニングするための素晴らしい‘ページ配信のレイテンシを犠牲にすることなく、管理可能なサイズまでの依存関係グラフ
- **大きなコミット・メッセージのボイラープレート・チャーンを減少させることで、構築された変更セットのピア・レビューと監視を改善
- lousy (ドキュメント・ルート内の別の場所にWebページ全体を再コンテキスト化する場合)’階層
テンプレートAPI
ssiタグ
Syntax:
{% ssi `/content_rooted/path/to/source_file` %}
- ルートのパス
コンテンツソース・ディレクトリ - ソース・ファイルのヘッダー部分をスキップします。
ssi含む - ターゲット・パス内の絶対URLに相対URLを書き換えます。’含まれるコンテンツ
ssiフィルタ
Syntax:
{{ コンテンツ|ssi }}
- 再帰的に評価
ssiフィルタする値のタグ - 大きい値(3+)の使用を避けるために有用
quick_depsA@path:: パターンエントリー’パフォーマンスに影響を与える可能性のある引数hashref
SymLinksを使用しない理由
- 安全にサポートすることが難しいファイルシステムの抽象化
<VirtualHost>コンテキスト - 伝統的な同じダウンサイド
ssiウェブページ全体 - 私たちのOrion Enterprise Wiki システムはそれらをサポートしていません
パーマリンク用のビルドツール
文書キュレーション
オリオン’s build system has integrated support for what we call Document Curation、 which is the process of recontextualizing and reorganizing your content based on how you set.ビルドシステムには、私たちが「Document Curation」と呼ぶものに対する統合されたサポートがあります。カテゴリ およびアーカイブ Markdownソース・ファイルのヘッダー。これらの機能はデフォルトで無効になっていますが、category_root (カテゴリ・サポート用)またはarchive_root (アーカイブサポート用)関連するhashref引数で目的@path:: パターン 入力。
カテゴリ
- テンプレートを使用して新しいコンテンツを構築
ssiパーマリンクの場所を指し示すタグ、アーカイブ構築されたソース・ページからのヘッダー - カテゴリは厳密に追加される(つまり、ソース・ページからカテゴリを削除する)’sヘッダーはライブサイトのそのカテゴリから削除しません)、
オンデマンドで生成 - 1つのコミットですべてのカテゴリを削除することは、すべてのソース・ページの正確な仕様と同期する優れた方法です。’ ライブ・サイトの保存されたカテゴリ・コンテンツを破棄せずにヘッダー
アーカイブされたページ
当サイトでは、古いエッセイを積極的にアーカイブして、新しいエッセイのビルド時間を低くし、アーカイブされたドキュメントへのパーマリンクを破壊しません。依存グラフ アーカイブ/ ディレクトリ(当社のサイト用)は、次のルールに従って合理的に自己完結しています。
- テンプレートを使用して作成されたコンテンツ
ssiパーマリンクの場所を指し示すタグ、カテゴリおよびアーカイブ構築されたソース・ページからのヘッダー - コンテンツ
/(日|クライアント)/アーカイブ後も常にパーマリンクです。 - アーカイブにより、パーマリンクの場所が依存関係グラフから効果的に削除されますが、パーマリンク自体はウェブサイトから削除されません
Lede
Markdownに埋め込まれたHTMLコメントは、LEDEコンテンツのフォーム境界を提示します。使用**{引合番号}*この目的のため。
導線の処理は、レド テンプレート・フィルタこれと結合すると便利です。ssi 複数のカテゴリ・ページを含むカテゴリ・ファイルを索引付けするためのフィルタ。
結論
興味深いデータ構造と関係は、ウェブサイトを扱うときにまだ明らかにされています’ビルド・パフォーマンスの観点から見たs dependency graph。これは、データ構造やリンク・トポロジを取り巻く関連問題に関する研究文献よりもはるかに新しい関心分野です*1,2.
純粋なソフトウェア開発プロジェクトのための従来のインクリメンタル・ビルドはまだホット・トピックです。調査対象3,4 2022年10月に、このエッセイが完了する約1ヶ月前に発表されました。pluto5 ビルド・システムには、当社の機能とほぼ同じ機能があります(ビルド自体は、依存関係を動的に再生成および再構築できます)。
良いニュースは、私たちがお客様としてカバーしていることです。私たちは、この分野におけるベストプラクティスとアートの状態を常に把握しますので、過去10年間、そして明日にかけて学んだ私たちの教訓から利益を得ることができます。
脚注
リンク・トポロジに基づくWebグラフ内のクラスタの識別 2003年第7回国際データベース工学・応用シンポジウム手続き
リンク・トポロジからのWebコミュニティの推測 ハイパーテキストとハイパーメディアに関する第9回ACM会議の進行: リンク、オブジェクト、時間とスペース— ハイパーメディアシステムの構造: リンク、オブジェクト、時間と空間— 1998年ハイパーメディアシステム
増分ビルド・ソフトウェア構成の利点と限界について: 調査研究 ICSE ‘22: 第44回ソフトウェア・エンジニアリング国際会議(2022年5月)の進行
ソフトウェア構成の増分構築に向けて アイスニア’22: ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results 2022年5月
動的依存関係を持つサウンドと最適なインクリメンタルビルドシステム OOPSLA 2015: オブジェクト指向プログラミング、システム、言語、およびアプリケーションに関する2015 ACM SIGPLAN国際会議の進行2015年
