Was versteht man unter Smart Content Dependency ManagementTM?
Abstrakt
Smart Content Dependency Management™ Es geht um den Kreis von Ideen, die mit der Unterstützung und Erleichterung von inkrementellen Builds verbunden sind, während sie dem Inhaltsnormalisierungsprinzip treu bleiben — das Permalinks sollte die Single Source of Truth sein, unabhängig davon, wie ihr Inhalt im gesamten Quellbaum und den daraus resultierenden Build-Artefakten kuratiert wird.
Dieser Artikel präsentiert die https://sunstarsys.com/-Website als Fallstudie, um Best Practices zu demonstrieren und die zugehörigen Diagrammtopologien zu analysieren.
Vorbehalte
Dies ist nur wichtig, wenn Sie die Kosten für die Durchführung vollständiger Website-Builds jedes Mal abwägen müssen, wenn Sie die Inhalte auf einer Webseite optimieren müssen. Wenn Ihre Website weniger als 1K-Quelldateien enthält, entspannen, und lesen Sie Folgendes mit Blick auf Ihre zukünftigen Anforderungen. Sie haben sich für die Nutzung unserer Plattform entschieden, die so konzipiert ist, dass sie mit Ihnen skaliert werden kann, nicht gegen Sie. Bei den meisten Seiten handelt es sich im folgenden Material um Diagramme mit dünner Inhaltsabhängigkeit für Websites mit mehr als 1K Seiten.
Beispielsweise konnte die Apache https://www.OpenOffice.Org-Website ihre 40K+-Dateien mit der ursprünglichen Apache-Version dieses Build-Systems erstellen, mit vollständig integrierter Unterstützung für inkrementelle Builds. — ohne konfigurierte Abhängigkeiten — durch die intelligente Nutzung der traditionellen SSI-Technologie allein.
Standardmäßig erstellt unser Build-System nur die Dateien, die Sie geändert haben, ohne die Intra-File-Abhängigkeiten zu berücksichtigen (es sei denn, Sie geben sie in %path::Abhängigkeiten
— mehr dazu unten). Wenn die geänderte Datei in Vorlagen/
oder lib/
Stattdessen wird ein vollständiger Site-Build ausgelöst.
Das Abhängigkeitsdiagramm Ihrer Website zusammen weben
Mathematik, eine Topologie ist eine vollständige Spezifikation der open Teilmengen eines Raumes
, deren Zweck darin besteht, die Näherungsbeziehungen zwischen Punkten anzugeben
des Raumes
. Wann
ist ein Graph, eine Topologie
für
entspricht der Angabe der Kanten, die Scheitelpunkte des Diagramms miteinander verbinden (hier werden Scheitelpunkte als Punkte von
, und die Verbindungskanten bestimmen die Nachbarschaft dieser Punkte als basis offene Sätze für die Topologie). Eine gerichtete Diagrammtopologie ist im Wesentlichen dasselbe, enthält aber einen Verweis auf eine topologische Einbettung von
in einen größeren topologischen Raum
, wobei die Kantenverbindungen der Einbettung durch gerichtete, nicht schneidende (Jordanische) Kurven dargestellt werden.
Das letztere Konzept wird verwendet, wenn wir die Topologie des Abhängigkeitsdiagramms diskutieren mit dem Bereich verknüpft
der Quelldateien unter Ihrer Site
Inhalt/
Unterverzeichnis (hier) ist
mit seiner Metriktopologie für
und die Kanten der
sind nicht schneidende, gerichtete Jordan-Kurven, die eine Datei verbinden
zu seinen Dateien, auf denen
hängt von:
).
Haben Ein klares Verständnis der Abhängigkeitsgrafik Ihrer Website stellt sicher, dass Sie die Leistung unserer Build-Technologie im großen Maßstab maximieren können. Wir nehmen die von Ihnen angegebenen Informationen an %path::Abhängigkeiten
während des Builds Ihrer Website lib/path.pm
Datei erstellen, eine umgekehrte Zuordnung von abhängigen Dateien erstellen und diese umgekehrte Zuordnung verwenden, um den vollständigen Korpus von Dateien zu bestimmen, die für eine bestimmte Datei erstellt werden sollen svn Commit
Sie machen zu unserem System.
Es ist wichtig zu beachten, dass die Abhängigkeitsbeziehungen zwischen Quelldateien vollständig von der %path::Abhängigkeiten
Hash beim Hochfahren des Build-Systems von lib/path.pm
aus Ihrem Quellbaum, so sind die in unserem SunStarSys::Anzeigen
Perl-Paket soll funktionieren. Die walk_content_tree
, archiviert
und seed_file_deps
Importierbare Utility-Funktionen aus SunStarSys::Bis
sind nützliche Hilfsmittel beim Aufbau der %path::Abhängigkeiten
Hash, mit integrierter Unterstützung für die Verwaltung eines Abhängigkeitscache, um inkrementelle Builds in großem Maßstab zu beschleunigen.
Hier ist der Teil unseres Lebens 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>};
};
Bitte überarbeiten Sie diesen Code für Ideen, wie Sie Ihre Website funktionieren möchten. Ja, es gibt eine gewisse Komplexität (die sowohl die regulären Ausdrücke von Perl als auch die UNIX C-Shell von Perl umfasst) Globus
auf eine sehr genaue Art und Weise) wie %path::Abhängigkeiten
wird in dieser Datei erstellt, aber anstatt dies nur als Optimierungsarbeit zu betrachten, betrachten Sie es stattdessen als Bereitstellung der grundlegenden Zutaten, die für die automatisierte, dynamisch generierte Erstellung wichtiger Aspekte der Link-Topologie erforderlich sind.
Wo finden Einträge in %path::Abhängigkeiten
Ursprung? Wenn sie nicht aus einem Aufruf von walk_content_tree { seed_file_deps ... }
, (die im Grunde in die Header und den Inhalt Ihrer Markdown-Quelldateien eintaucht), dann sind sie nur hartcodiert in lib/path.pm
zur Ladezeit.
Zyklische Abhängigkeitsdiagramme sind die Norm
Unsere Website besteht derzeit aus 240 Quelldateien
in Inhalt/
. Hier ist ein 85 Scheitelpunkte x 465 Kanten
, scrollbare, zweidimensionale gerichtete Diagrammdarstellung eines aktuellen Snapshots der englischsprachigen Seitenabhängigkeiten auf unserer Site (Verwenden von GraphViz Punkt
):
.
Ganz komplex, auch für eine kleine Website wie diese! Viele Kantenschnittstellen beim Nehmen (vermeidbar in Dimension)
). Besonders hervorzuheben ist der Kernsatz von dichten, zyklischen Abhängigkeiten in den nicht archivierten Dateien unserer Website.
/Veranstaltungen/
Verzeichnis, in Richtung der unteren Mitte-rechts des Diagramms, was das Abhängigkeitsdiagramm einer guten Blogging-Site aussehen sollte. Diese Abhängigkeiten werden in rote Kurven
im Bild.
Beachten Sie auch die innere, im Wesentlichen isolierte Verbindung der Elemente in /Kategorien/*/*
und /archives/2022/11/*
. Die einzigen externen Abhängigkeiten beinhalten nicht archivierte Inhalte in /Veranstaltungen/*
. Dies ist durch Design — die archivierten Essays sollten sich nur adiabatisch ändern, vielleicht nur für Anpassungen ihrer Kategorie
Kopfzeilen. Keine dieser Änderungen wirkt sich wesentlich auf die bereits vorhandenen Inhalte aus, daher verfolgen wir sie nicht in %path::Abhängigkeiten
.
Natürlich unsere Orion Enterprise Wiki Es gab nie Probleme mit zyklischen Abhängigkeiten.
Handelt es sich nicht nur um Hyperlinks?
Nein! In der Tat ist die Link-Topologie Ihrer Website eine völlig separate Angelegenheit vom Abhängigkeitsdiagramm des Quellbaums. Eine Suchmaschine wird natürlich die Link-Topologie austauschen, hat aber keinen Einblick in das Abhängigkeitsdiagramm.
Hier ist ein 240+ Scheitelpunkte x 3859 Kanten
, aktuelle Vogelperspektive-Grafik der englischen Link-Topologie-Grafik für unser Standort (Verwenden von GraphViz Twopi
):
.
Können Sie die rote Kanten
wie im Abhängigkeitsdiagramm angegeben? Das Link-Topologie-Diagramm ist qualitativ und quantitativ sehr unterschiedlich von dem oben abgebildeten (dramatisch kleineren und weniger miteinander verbundenen) Abhängigkeitsdiagramm.
Wie SSI-Technologie helfen kann
Traditionell Serverseitige Inklusive (SSI).
- Toll, um das Abhängigkeitsdiagramm Ihrer Website auf eine überschaubare Größe zu reduzieren, ohne die Latenz der Seitenzustellung zu beeinträchtigen
- ** großartig** zur Verringerung der Abwanderung von Boilerplate in großen Commit-Nachrichten für eine bessere Peer-Überprüfung und Überwachung Ihrer erstellten Änderungssets
- lousy zur Retexualisierung ganzer Webseiten an einen anderen Ort in der Hierarchie Ihres Dokumentstamms
Vorlagen-APIs
ssi-Tag
Syntax:
{% ssi
`/content_rooted/path/to/source_file` %}
- Wege verwurzelt in
Inhalt
Quellverzeichnis - Überspringt den Headerteil der Quelldatei
ssi
inklusive - schreibt relative URLs in absolute URLs im enthaltenen Inhalt des Zielpfads um
ssi-Filter
Syntax:
{{ Inhalt|ssi }}
- rekursiv bewertet
ssi
Tags im zu filternden Wert - nützlich, um die Verwendung eines großen Wertes (3+) von
quick_deps
in a@path::Muster
Eintragsargument hashref, das sich auf die Leistung auswirken kann
Warum nicht SymLinks?
- Barebones-Dateisystemabstraktion, die in einer
<virtualhost>
Kontext - gleiche Nachteile mit traditionellen
ssi
auf vollständigen Webseiten - unsere Orion Enterprise Wiki System unterstützt sie nicht
Build-Tools für Permalinks
Dokumentkuratierung
Das Build-System von Orion hat eine integrierte Unterstützung für das, was wir Document Curation nennen, was der Prozess der Neustrukturierung und Reorganisation Ihrer Inhalte ist, basierend auf der Art und Weise, wie Sie die Kategorien
und Archiv
Header in Ihren Markdown-Quelldateien. Diese Features sind standardmäßig deaktiviert, können jedoch durch Festlegen eines category_root
(für Kategorieunterstützung) oder archive_root
(zur Archivierung) im zugehörigen Hash-Argument zum gewünschten @path::Muster
Eintrag.
Kategorien
- Neuer Inhalt wird mit Vorlage erstellt
ssi
Tags, die auf den Permalink-Speicherort verweisen, während dieArchiv
Header von der Seite mit der erstellten Quelle - Kategorien sind rein additiv (d. h. das Entfernen einer Kategorie aus den Kopfzeilen einer Quellseite entfernt sie nicht aus dieser Kategorie auf der Live-Website),
- bei Bedarf generiert
- Löschen aller Kategorien in einem einzigen Commit ist eine großartige Möglichkeit, sie mit den genauen Spezifikationen in den Kopfzeilen aller Quellseiten zu synchronisieren, ohne den beibehaltenen Kategorieinhalt auf der Live-Site zu zerstören
Archivierte Seiten
Auf unserer Website archivieren wir aggressiv veraltete Aufsätze, um die Erstellungszeiten für neue Aufsätze niedrig zu halten, ohne Permalinks zu archivierten Dokumenten zu zerstören. Das Abhängigkeitsdiagramm relativ zum /Archive/
Das Verzeichnis (für unsere Website) ist gemäß den folgenden Regeln einigermaßen eigenständig:
- Inhalt erstellt mit Vorlage
ssi
Tags, die auf den Permalink-Speicherort verweisen, während dieKategorien
undArchiv
Header von der Seite mit der erstellten Quelle - Inhalt in
/(Leistungen|Kunden)/
sind immer Permalinks, auch nach der Archivierung - Archivierung entfernt effektiv den Permalink-Standort aus dem Abhängigkeitsdiagramm, ohne den Permalink selbst von der Website zu entfernen
Lede
HTML-Kommentare, die in die Markdown-Prosa-Formgrenzen des Lede-Inhalts eingebettet sind. Wir verwenden {Anz. Ausschreibungen} zu diesem Zweck.
Die Verarbeitung erfolgt mit dem Lede
Vorlagenfilter. Es ist nützlich, dies mit dem ssi
Filter für die Indexierung einer Kategoriedatei mit mehr als einer Kategorieseite darin.
Schlussfolgerungen
Es gibt interessante Datenstrukturen und -beziehungen, die noch aufgedeckt werden müssen, wenn es um den Abhängigkeitsdiagramm einer Website aus einer Build-Performance-Perspektive geht, was ein viel neuerer Bereich von Interesse ist als die Forschungsliteratur, die sich mit den Datenstrukturen und zugehörigen Problemen rund um die Link-Topologie1,2 befasst.
Herkömmliche inkrementelle Builds für reine Softwareentwicklungsprojekte sind nach wie vor ein heißes Thema. Die in 3,4 behandelte Studie wurde im Oktober 2022 veröffentlicht, etwa einen Monat, bevor dieser Aufsatz voraussichtlich abgeschlossen sein wird. Das pluto5-Build-System verfügt über Funktionen, die unseren sehr ähnlich sind (der Build selbst kann Abhängigkeiten dynamisch neu generieren und neu erstellen).
Die gute Nachricht ist, dass wir Sie als unseren Kunden abgedeckt haben. Wir halten Sie über die Best Practices und den Stand der Technik in diesem Bereich auf dem Laufenden, so dass Sie von unseren Erfahrungen in den letzten zehn Jahren und bis in die Zukunft profitieren.
Fußnoten
Identifizierung von Clustern im Webdiagramm auf Basis der Linktopologie Seventh International Database Engineering and Applications Symposium, 2003. Verfahren
Webcommunitys aus Linktopologie inferenzieren Proceedings der neunten ACM-Konferenz zu Hypertext und Hypermedia: Links, Objekte, Zeit und Raum — Struktur in Hypermediasystemen: Links, Objekte, Zeit und Raum — Struktur in Hypermediasystemen. 1998.
Zu den Vorteilen und Grenzen inkrementeller Build-Softwarekonfigurationen: eine explorative Studie ICSE ‘22: Proceedings of the 44th International Conference on Software Engineering, Mai 2022
Zur inkrementellen Erstellung von Softwarekonfigurationen ICSE-NIER ‘22: Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: Neue Ideen und neue Ergebnisse, Mai 2022
Ein solides und optimales inkrementelles Build-System mit dynamischen Abhängigkeiten OOPSLA 2015: Proceedings der ACM SIGPLAN International Conference 2015 über objektorientierte Programmierung, Systeme, Sprachen und Anwendungen Oktober 2015