Worum geht es bei Smart Content Dependency Management™?

[WHITEPAPER] Zuletzt aktualisiert von Joe Schaefer am Sa., 25 Apr. 2026    Quelle
 

Baum


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 τ\tau ist eine vollständige Spezifikation der open Teilmengen eines Raumes XX, deren Zweck es ist, die Annäherungsbeziehungen zwischen Punkten anzugeben xx des Raumes XX. Wenn XX ist eine Grafik, eine Topologie τ\tau für XX Gibt an, welche Kanten die Scheitelpunkte des Diagramms miteinander verbinden (hier werden Scheitelpunkte als Punkte von XX, 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 (X,τ)(X,\tau) in einen größeren topologischen Raum (Y,σ)(Y,\sigma) , 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 τ\tau dem Bereich zugeordnet XX von Quelldateien unterhalb der Inhalt/ Unterverzeichnis (hier (Y,σ)(Y,\sigma) ist Rn\mathbb{R}^n mit seiner metrischen Topologie für n{2,3}n \in \{2,3\}und die Kanten der XX sind nicht schneidende, gerichtete Jordan-Kurven, die eine Datei verbinden xXx \in X zu seiner Gruppe von Dateien, auf denen xx hängt ab: {xXxx}\set{x^\prime \in X | x \rightarrow x^\prime}).

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):

Englisch Sprachabhängigkeiten

Ganz komplex, auch für eine kleine Website wie diese! Viele Kantenschnittmengen bei der Einnahme n=2n=2 (vermeidbar in Dimension) n=3n=3). 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.

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)

Vorlagen-APIs

SSI-Tag

Syntax:

{% Ssi `/content_rooted/path/to/source_file` %}

SSI-Filter

Syntax:

{{ Inhalt|ssi }}

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
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:

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

  1. Identifizierung von Clustern im Webdiagramm basierend auf Linktopologie Siebtes Internationales Symposium für Datenbankentwicklung und -anwendungen, 2003. Verfahren.

  2. 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.

  3. Zu den Vorteilen und Grenzen inkrementeller Build-Softwarekonfigurationen: eine explorative Studie ICSE ‘22: Proceedings of the 44th International Conference on Software Engineering, Mai 2022

  4. 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

  5. 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