Worum geht es bei Smart Content Dependency Management™?
Abstrakt
Smart Content-Abhängigkeitsmanagement™ geht es um den Kreis der Ideen, die mit der Unterstützung und Moderation von inkrementellen Builds zusammenhängen, während sie dem Inhaltsnormalisierungsprinzip treu bleiben. — das Pflichtfelder sollte die einzige Quelle der Wahrheit sein, unabhängig davon, wie ihr Inhalt im gesamten Quellbaum kuratiert wird und daraus resultierende Build-Artefakte erstellt werden.
Dieser Artikel stellt die https://sunstarsys.com/ Website als Fallstudie zur Demonstration von Best Practices und Analyse der zugehörigen Diagrammtopologien.
Anzahl Vorbehalte
Dies ist nur wichtig, wenn Sie die Kosten für die Ausführung vollständiger Website-Builds abwägen müssen, jedes Mal, wenn Sie den Inhalt auf einer Webseite optimieren müssen. Wenn Ihre Website weniger als 1K-Quelldateien enthält, relax, und lesen Sie Folgendes mit Blick auf Ihre zukünftigen Bedürfnisse. Sie haben sich entschieden, unsere Plattform zu nutzen, die darauf ausgelegt ist, mit Ihnen zu skalieren, nicht gegen Sie. Bei den meisten Seiten handelt es sich bei diesem Material um dünne Inhaltsabhängigkeitsdiagramme für Sites mit mehr als 1K-Seiten.
Zum Beispiel die Apache https://www.OpenOffice.Org Die Website konnte 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 Bedenken hinsichtlich der Intrafile-Abhängigkeiten (es sei denn, Sie geben sie in %path::Abhängigkeiten — mehr dazu unten). Wenn sich die geänderte Datei in der Vorlagen/ oder Bibliothek/ Ein vollständiger Site-Build wird stattdessen ausgelöst.
Weben der Abhängigkeitsgrafik Ihrer Website zusammen
Mathematisch, eine Topologie ist eine vollständige Spezifikation der open Teilmengen eines Raumes , deren Zweck es ist, die Annäherungsbeziehungen zwischen Punkten anzugeben des Raumes . Wenn ist eine Grafik, eine Topologie für Gibt an, welche Kanten die Scheitelpunkte des Diagramms miteinander verbinden (hier werden Scheitelpunkte als Punkte von , und die Anschlusskanten bestimmen die Nachbarschaft dieser Punkte als Basis offene Sätze für die Topologie). Eine gerichtete Diagrammtopologie ist im Wesentlichen die gleiche Sache, 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 (Jordan-)Kurven dargestellt werden.
Das letzte Konzept ist, was wir verwenden werden, wenn wir die Topologie des Abhängigkeitsdiagramms diskutieren dem Bereich zugeordnet von Quelldateien unterhalb der Inhalt/ Unterverzeichnis (hier ist mit seiner metrischen Topologie für und die Kanten der sind nicht schneidende, gerichtete Jordan-Kurven, die eine Datei verbinden zu seiner Gruppe von Dateien, auf denen hängt ab: ).
Haben Ein klares Verständnis des Abhängigkeitsgraphen Ihrer Website stellt sicher, dass Sie die Leistung unserer Build-Technologie in großem Maßstab maximieren können. Wir nehmen die Informationen, die Sie zur Verfügung stellen %path::Abhängigkeiten während der Build-Last Ihrer Website lib/path.pm Datei erstellen, eine umgekehrte Zuordnung abhängiger Dateien erstellen und diese umgekehrte Zuordnung verwenden, um das vollständige 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 während der Startlast des Build-Systems von lib/path.pm aus Ihrem Quellbaum, wie die in unserer SunStarSys::Anzeigen Perl-Paket soll funktionieren. Die walk_content_tree, archiviertund seed_file_deps Utilityfunktionen, aus denen importiert werden kann SunStarSys: Bis sind nützliche Hilfsmittel beim Aufbau der %path::Abhängigkeiten Hash mit integrierter Unterstützung für die Verwaltung eines Abhängigkeitscaches, 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|js)\b#;
return if -d "content/$_";
seed_file_deps, seed_file_acl if /\.(?:md|ya?ml)\b[^\/]*$/;
my $path = $_;
utf8::is_utf8 $path or utf8::decode $path;
state $count = 0;
for my $lang (qw/en es de fr ru sv he zh-TW ar ko ja pt-BR/) {
delete $dependencies{"/sitemap.html.$lang"} if ++$count <= 12;
next if m!\.page/!;
if (/\.md\.$lang$/ or m!/index\.html\.$lang$!) {
push @{$dependencies{"/sitemap.html.$lang"}}, $path if !archived;
}
if (/^(.*)\.tex\.$lang$/ and -f "content$1.bib.lang") {
push @{$dependencies{$path}}, "$1.bib.$lang";
}
if ($path =~ s!/index\.html\.$lang$!!) {
$dependencies{"$path/index.html.$lang"} = [
grep {utf8::decode $_; s/^content//}
glob("'content$path'/*.md.$lang"),
glob("'content$path'/*/index.html.$lang")
];
}
}
}
and do {
while (my ($k, $v) = each %{$facts->{dependencies}}) {
$dependencies{$k} = [grep $k ne $_, grep s/^content// && !archived, map glob("'content'$_"), ref $v ? @$v : split /[;,]?\s+/, $v];
}
open my $fh, "<:raw", "lib/acl.yml" or die "Can't open acl.yml: $!";
unshift @acl, @{Load join "", <$fh>};
my %cache;
@acl = grep !$cache{$_->{path}}++, @acl;
for (glob("content/*/index.md.*")) {
next if /archives|categories/;
s!/index\.md\.[^/]+$!!;
push @acl, { path => $_, rules => {
'@bloggers' => 'rw',
'@svnadmin' => 'rw',
'*' => 'r',
}} unless $cache{$_}++;
}
};
Bitte tue diesen Code für Ideen, wie deine Website funktionieren soll. 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) glob Schnittstellen, sehr präzise) wie %path::Abhängigkeiten wird in dieser Datei erstellt, aber anstatt dies nur als Optimierungsarbeit anzusehen, betrachten Sie es stattdessen als die grundlegenden Inhaltsstoffe, die für die automatisierte, dynamisch generierte Konstruktion wichtiger Aspekte der Link-Topologie erforderlich sind.
Wo sind 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 Inhalte Ihrer Markdown-Quelldateien eintaucht), dann sind sie nur hartcodiert in lib/facts.yml zur Ladezeit.
Zyklische Dependency Graphs sind die Norm
Unsere Website besteht derzeit aus 240 Quelldateien in Inhalt/. Hier ist ein 85 Scheitel x 465 Kanten, Bildlauffähige, zweidimensionale, gerichtete Diagrammdarstellung eines aktuellen Snapshots der Seitenabhängigkeiten in englischer Sprache von unserer Site (GraphViz’s verwenden Punkt):
Ganz komplex, auch für eine kleine Website wie diese! Viele Kantenschnittmengen bei der Einnahme (vermeidbar in Dimension) ). Besonders hervorzuheben ist die Kernmenge von dichten, zyklischen Abhängigkeiten in den nicht archivierten Dateien in der /Termine/ Verzeichnis, in Richtung der unteren Mitte-rechts des Diagramms, wie das Abhängigkeitsdiagramm einer guten Blogging-Site aussehen sollte. Diese Abhängigkeiten werden in rote Kurven im Bild.
Beachten Sie auch die interne, im Wesentlichen isolierte Vernetzung der Elemente in /Kategorien/*/* und /archives/2022/11/*. Die einzigen externen Abhängigkeiten beinhalten nicht archivierte Inhalte in /Tag/*. Das 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 den bereits vorhandenen Inhalt aus, daher verfolgen wir ihn nicht in %path::Abhängigkeiten.
Natürlich unsere Orion Enterprise Wiki Es gab nie Probleme mit zyklischen Abhängigkeiten.
Geht es 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 entfernen, hat aber keinen Einblick in das Abhängigkeitsdiagramm.
Hier ist ein 240+ Scheitelpunkte x 3859 Kanten, aktuelles Vogel-Augen-Diagramm der englischen link topology Grafik für unser Standort (GraphViz’s verwenden Twopi):
Können Sie die rote Ränder Wie im Abhängigkeitsdiagramm angegeben? Das Diagramm link topology ist qualitativ und quantitativ sehr verschieden von dem oben dargestellten (dramatisch kleineren und weniger miteinander verbundenen) abhängigen Diagramm.
Wie die SSI-Technologie helfen kann
Traditionell Serverseitig inklusive (SSI)
- groß zum Beschneiden des Abhängigkeitsdiagramms Ihrer Website auf eine überschaubare Größe, ohne die Latenz der Seitenbereitstellung zu beeinträchtigen
- groß zur Verringerung der Boilerplate-Abwanderung in großen Commit-Nachrichten für eine bessere Peer-Überprüfung und Kontrolle Ihrer erstellten Änderungssets
- Lousie für die Retexualisierung ganzer Webseiten an einen anderen Ort in der Hierarchie Ihres Dokumentstammes
Vorlagen-APIs
SSI-Tag
Syntax:
{% Ssi `/content_rooted/path/to/source_file` %}
- Wege verwurzelt in
InhaltQuellverzeichnis - Überspringt den Header-Teil der Quelldatei
Ssienthalten - schreibt relative URLs in absolute URLs im enthaltenen Inhalt des Zielpfads um
SSI-Filter
Syntax:
{{ Inhalt|ssi }}
- Rekursiv bewertet
SsiTags im zu filternden Wert - nützlich, um die Verwendung eines großen Wertes (3+) von
quick_depsin einem@path::MusterEintrag Argument hashref, was die Leistung beeinflussen kann
Warum nicht SymLinks?
- Barebones-Dateisystemabstraktion, die in einem
<VirtualHost>Kontext - gleiche Nachteile mit traditionellen
Ssiauf vollständigen Webseiten - unsere Orion Enterprise Wiki System unterstützt sie nicht
Tools für Permalinks erstellen
Dokumentkuratierung
Das Build-System von Orion bietet integrierte Unterstützung für das, was wir Document Curation nennen. Dabei handelt es sich um den Prozess der Rekontextualisierung und Reorganisation Ihrer Inhalte, je nachdem, wie Sie die Kategorien und Status Header in den Markdown-Quelldateien. Diese Funktionen sind standardmäßig deaktiviert, können aber durch Festlegen eines category_root (für Kategorieunterstützung) oder archive_root (für Archivierungsunterstützung) im zugehörigen Hashref-Argument zum gewünschten @path::Muster Eintrag.
Kategorien
- neuer Inhalt mit Vorlage erstellt
SsiTags, die zurück zum Permalink-Speicherort zeigen, - Kategorien sind streng additiv (d.h. das Entfernen einer Kategorie aus den Headern einer Quellseite entfernt sie nicht aus dieser Kategorie auf der Live-Site),
- bei Bedarf generiert,
- Das Löschen aller Kategorien in einem einzigen Commit ist eine großartige Möglichkeit, sie mit den genauen Spezifikationen in den Headern aller Quellseiten zu synchronisieren, ohne den beibehaltenen Kategorieinhalt auf der Live-Site zu zerstören.
Archivierte Seiten
Auf unserer Website archivieren wir aggressiv veraltete Essays, um die Erstellungszeiten für neue Essays niedrig zu halten, ohne Permalinks für archivierte Dokumente zu zerstören. Das Abhängigkeitsdiagramm relativ zum /Archive/ Das Verzeichnis (für unsere Website) ist gemäß den folgenden Regeln in sich geschlossen:
- Inhalt mit Vorlage erstellt
SsiTags, die auf den Permalink-Speicherort verweisen, während dieKategorienHeader von der erstellten Quellseite - Inhalt in
/(essays|clients)/sind immer Permalinks, auch nach der Archivierung - Die Archivierung entfernt den Permalink-Speicherort effektiv aus dem Abhängigkeitsdiagramm, ohne den Permalink selbst von der Website zu entfernen
Lede
HTML-Kommentare, die in die Markdown-Prosa eingebettet sind, bilden Grenzen des Lede-Inhalts. Wir verwenden {Anz. Lede} zu diesem Zweck.
Die Verarbeitung von Löwen erfolgt mit lede Vorlagenfilter. Es ist nützlich, dies mit dem Ssi Filter für die Indexierung einer Kategoriedatei mit mehreren Kategorieseiten darin.
Schlussfolgerungen
Es gibt noch interessante Datenstrukturen und Beziehungen, die beim Umgang mit dem Abhängigkeitsdiagramm einer Website aus einer Build-Performance-Perspektive aufgedeckt werden müssen, was ein viel neueres Interessengebiet ist als die Forschungsliteratur, die sich mit den Datenstrukturen und den damit verbundenen Problemen rund um die Link-Topologie befasst.1,2.
Konventionelle inkrementelle Builds für reine Softwareentwicklungsprojekte sind nach wie vor ein heißes Thema. Die Forschung im Bereich 3,4 wurde im Oktober 2022 veröffentlicht, etwa einen Monat bevor dieser Aufsatz voraussichtlich abgeschlossen sein wird. Der pluto5 Build-System verfügt über Funktionen, die unseren sehr ähnlich sind (der Build selbst kann Abhängigkeiten dynamisch neu generieren und neu aufbauen).
Die gute Nachricht ist, dass wir Sie als unseren Kunden abdecken. Wir werden Sie über die Best Practices und den Stand der Technik in diesem Bereich auf dem Laufenden halten, so dass Sie von unseren Lektionen profitieren werden, die in den letzten zehn Jahren und in Zukunft gelernt wurden.
Anzahl Fußnoten
Identifizierung von Clustern im Webdiagramm basierend auf Linktopologie Siebtes Internationales Symposium für Datenbankentwicklung und -anwendungen, 2003. Verfahren.
Webcommunitys aus Linktopologie inferenzieren Vorträge der neunten ACM-Konferenz zu Hypertext und Hypermedia: Links, Objekte, Zeit und Raum — Struktur in Hypermedia-Systemen: Links, Objekte, Zeit und Raum — Struktur in hypermedialen Systemen. 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
Inkrementelle Erstellung von Softwarekonfigurationen ICSE-NIER ‘22: Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results, Mai 2022
Ein solides und optimales inkrementelles Build-System mit dynamischen Abhängigkeiten OOPSLA 2015: Proceedings of the 2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages and Applications Oktober 2015
