Vad handlar Smart Content Dependency ManagementTM om?
Sammandrag
- Hantering av beroenden för smart innehåll™* handlar om cirkeln av idéer relaterade till att ge stöd och underlättande för inkrementella byggen, samtidigt som man håller sig till Innehållsnormaliseringsprincipen — det där permalänkar bör vara den enda källan till sanning, oavsett hur deras innehåll kurateras genom källträdet och resulterande byggartefakter.
I den här artikeln presenteras webbplatsen för https://sunstarsys.com/ som en fallstudie för en demonstration av praxis och analys av associerade diagramtopologier.
Antal förbehåll
Det här är bara viktigt när du behöver väga kostnaden för att utföra fullständiga webbplatsbyggen varje gång du behöver justera innehållet på en webbsida. Om webbplatsen innehåller mindre än 1K källfiler avslappnar och läs följande med ett öga på dina framtida behov. Du valde att använda vår plattform, som är utformad för att skala med dig, inte mot dig. För de flesta sidor handlar det här materialet nedan om glesa diagram över innehållsberoende för webbplatser med fler än 1K sidor.
Webbplatsen Apache https://www.OpenOffice.Org kunde till exempel bygga sina 40K+-filer med den ursprungliga Apache-versionen av det här byggsystemet, med fullt integrerat stöd för inkrementella byggen. — utan konfigurerade beroenden — genom att göra smart användning av traditionell SSI-teknik ensam.
Som standard bygger vårt byggsystem endast de filer som du har ändrat, utan problem för beroenden inom filen (om du inte anger dem i %path::beroenden — mer om detta nedan). Om filen du ändrade finns i mallar/ eller lib/ katalog, en fullständig webbplatsbygge utlöses istället.
Weaving Your Website’s *Dependency Graph * Tillsammans
Matematiskt en Topologi är en fullständig specifikation av de öppna delmängderna i ett utrymme , vars syfte är att ange närhetsrelationerna mellan punkter från rymden . När är ett diagram, en topologi för uppgår till att ange kanterna som förbinder diagrammets brytpunkter tillsammans (här ses brytpunkter som punkter för , och de anslutande kanterna bestämmer områdena för dessa punkter som grundläggande öppna uppsättningar för topologin). En riktad graftopologi är i huvudsak samma sak, men innehåller en hänvisning till en topologisk inbäddning av till ett större topologiskt rum , där inbäddningens kantanslutningar representeras av riktningskurvor som inte korsar varandra (Jordanien).
Det senare konceptet är vad vi kommer att använda när vi diskuterar *beroende diagrammets * topologi associerad med arbetsytan av källfiler under platsens innehåll/ underkatalog (här är med sin metriska topologi för och kanterna av är riktade jordanska kurvor som inte korsar varandra och som ansluter en fil till sin uppsättning filer som beror på: ).
Har en tydlig förståelse av din webbplats beroende graf kommer att se till att du kan maximera prestandan hos vår byggteknik i stor skala. Vi tar den information du tillhandahåller %path::beroenden under byggets laddning av webbplatsens lib/path.pm fil, konstruera en omvänd mappning av beroende filer och använd som omvänd mappning för att fastställa den fullständiga korpus av filer som ska skapas för varje given svn bekräftelse Du gör vårt system.
Det är viktigt att notera att beroenderelationerna mellan källfiler kan och bör fångas helt av %path::beroenden hash under byggsystemets startbelastning av lib/path.pm från ditt källträd, vilket är hur de inbyggda vyerna finns i våra SunStarSys::Visa Perl-paketet är tänkt att fungera. Den walk_content_tree, arkiveradoch seed_file_deps nyttofunktioner som kan överföras från SunStarSys::Till är användbara hjälpmedel för att konstruera %path::beroenden hash, med inbyggt stöd för att hantera ett beroendecacheminne för att påskynda inkrementella byggen i stor skala.
Här är den delen av vårt liv 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>};
};
Gör mull den koden över för idéer om hur du vill * din webbplats * att fungera. Ja det finns en viss rimlig komplexitet (som omfattar både Perls reguljära uttryck och Perls UNIX C-skal) glob gränssnitt, på ett mycket exakt sätt) kring hur %path::beroenden är konstruerad i den filen, men i stället för att bara se detta som optimeringsarbete, istället titta på det som att tillhandahålla de grundläggande ingredienserna som krävs för att konstruera stora aspekter av *link topologi * på ett automatiserat, dynamiskt genererat sätt.
Var finns posterna i %path::beroenden ursprung? Om de inte är födda av en walk_content_tree { seed_file_deps ... }, (som i princip dyker in i dina markdown-källfilers rubriker och innehåll), då är de bara hårdkodade i lib/path.pm vid laddtid.
Cykliska beroendediagram är normen
Vår webbplats består för närvarande av 240 källfiler om innehåll/. Här är en 85 hörn x 465 kanter, rullningsbar, tvådimensionell riktad grafrepresentation av en aktuell ögonblicksbild av beroenden på den engelska språksidan på vår webbplats (använda GraphViz punkt):
.
Ganska komplex, även för en liten webbplats som den här! Många kantskärningar när du tar (kan undvikas i dimension ). Av särskild vikt är kärnuppsättningen av täta, cykliska beroenden i de icke-arkiverade filerna på vår webbplats. /lektioner/ katalog, mot nedre mitten till höger i diagrammet, vilket är hur en bra bloggwebbplatsens beroendediagram ska se ut. Dessa beroenden dras in i röda kurvor i bilden.
Notera också den interna, väsentligen isolerade sammankopplingen av elementen i /kategorier/*/* och /archives/2022/11/*. De enda externa beroendena omfattar icke-arkiverat innehåll i /dagar/*. Detta är genom design — de arkiverade uppsatserna bör endast ändras adiabatiskt, kanske enbart för justeringar av deras Kategori rubriker Ingen av dessa ändringar påverkar det befintliga innehållet väsentligt, så vi spårar det inte i %path::beroenden.
Självklart, vår Wiki för Orion Enterprise har aldrig haft problem med att hantera cykliska beroenden.
Handlar det inte bara om hyperlänkar?
Nej! I själva verket är link-topologin på din webbplats en helt separat fråga från källträdets beroende diagram. En sökmotor kommer naturligtvis att iller ut link topologi, men har ingen inblick i beroende graf.
Här är en 240+ hörn x 3859 kanter, aktuella fågel-öga diagram över den engelska länka topologi graf för ** vår webbplats** (använda GraphViz twopi):
.
Kan du upptäcka röda kanter enligt vad som anges i beroende graf? Diagrammet link topology är kvalitativt och kvantitativt ** mycket annorlunda** än det (dramatiskt mindre och mindre sammanlänkade) beroende diagrammet som avbildas ovan.
Hur SSI-tekniken kan hjälpa till
Traditionell Serversidan innehåller (SSI).
- ** Stor** för beskärning av webbplatsens beroende diagram ner till hanterbar storlek utan att offra sidans leveranstid
- ** Stor** för att minska bortfall av mallobjekt i stora bekräftelsemeddelanden för bättre peer review och övervakning av dina byggda ändringsuppsättningar
- uppskov för att omtexualisera hela webbsidor till en annan plats i dokumentrotens hierarki
API:er för mallar
ssi-tagg
Syntax:
{% ssi `/content_rooted/path/to/source_file` %}
- sökvägar rotade i
nöjdkällkatalog - hoppar över huvuddelen av källfilen som ska
ssiingår - skriver om relativa URL:er till absoluta URL:er i målsökvägens inkluderade innehåll
ssi-filter
Syntax:
{{ innehåll|ssi }}
- rekursivt utvärderar
ssitaggar i värdet som ska filtreras - användbar för att undvika att använda ett stort värde (3+) av
quick_depsi en@path::mönsterinmatningens argument hashref, vilket kan påverka prestanda
Varför inte SymLinks?
- barebones filsystem abstraktion som är svårt att säkert stödja i en
<virtualhost>sammanhang kontext - samma nackdelar med traditionella
ssipå fullständiga webbsidor - vår Wiki för Orion Enterprise Systemet stöder inte dem
Byggverktyg för permalänkar
Dokumentvaraktighet
Orions byggsystem har integrerat stöd för vad vi kallar Document Curation, vilket är processen att retextualisera och omorganisera ditt innehåll baserat på hur du ställer in Kategorier och Arkivera rubriker i källfilerna för Markdown. Dessa funktioner är avaktiverade som standard, men kan aktiveras genom att ställa in en category_root (för kategoristöd) eller archive_root (för arkiveringsstöd) i det associerade hashref-argumentet till önskad @path::mönster inmatning.
Kategorier
- nytt innehåll konstrueras med hjälp av mall
ssitaggar som pekar tillbaka till permalänkplatsen, medan du tar bortArkiverasidhuvud från den konstruerade källsidan - kategorier är strikt additiva (dvs. att ta bort en kategori från en källsidas rubriker kommer inte att ta bort den från den kategorin på den aktiva webbplatsen),
- genererad på begäran
- Att ta bort alla kategorier i ett enda åtagande är ett bra sätt att synkronisera dem med de exakta specifikationerna i alla källsidors rubriker, utan att förstöra det bevarade kategoriinnehållet på den levande webbplatsen
Arkiverade sidor
På vår webbplats arkiverar vi aggressivt inaktuella essäer för att hålla byggtiden för nya essäer låg, samtidigt som vi inte förstör permalänkar till arkiverade dokument. beroende graf i förhållande till /arkiv/ katalogen (för vår webbplats) är rimligt fristående enligt följande regler:
- innehåll konstruerat med hjälp av mall
ssitaggar som pekar tillbaka till permalänkplatsen, medan du tar bortKategorierochArkiverarubriker från den konstruerade källsidan - innehåll i
/(essays|clients)/är alltid permalänkar, även efter arkivering - arkivering effektivt tar bort permalänk plats från *beroende graf *, medan inte ta bort permalänken själv från webbplatsen
Lede
HTML-kommentarer inbäddade i Markdown-prosans formgränser för lede-innehållet. Vi använder {Antal ledtrådar} för detta ändamål.
Bearbetningslinjer görs med ledare Mallfilter. Det är nyttigt att kombinera detta med ssi filter för indexering av en kategorifil med mer än en kategorisida i den.
Slutsatser
Det finns intressanta datastrukturer och relationer som ännu inte kan avslöjas när man hanterar en webbplats beroende diagram från ett byggprestandaperspektiv, vilket är ett mycket nyare intresseområde än forskningslitteraturen som gräver i datastrukturerna och tillhörande isärtaganden som omger länka topologi1,2.
Konventionella inkrementella byggen för rena mjukvaruutvecklingsprojekt är fortfarande ett hett ämne. Den forskning som omfattas av 3 4 publicerades i oktober 2022, ungefär en månad innan denna uppsats förväntas vara klar. Byggsystemet pluto5 har funktioner som liknar våra (själva bygget kan dynamiskt återskapa och återskapa beroenden).
Den goda nyheten är att vi har dig täckt som vår kund. Vi kommer att hålla dig informerad om bästa praxis och den senaste tekniken inom detta område, så att du kommer att dra nytta av våra lärdomar under det senaste decenniet och in i framtiden.
Fotnoter
Identifiering av kluster i webbdiagrammet baserat på länktopologi Sjunde International Database Engineering and Applications Symposium, 2003. förfaranden.
Hämta webbforum från länktopologi Den nionde ACM-konferensen om hypertext och hypermedia: länkar, objekt, tid och rum — struktur i hypermedia system: länkar, objekt, tid och rum — struktur i hypermediasystem. 1998.
Om fördelarna och gränserna för inkrementella konfigurationer av programvara: en undersökande studie ICSE ‘22: Förfaranden vid den 44:e internationella konferensen om programvaruteknik, maj 2022
Mot inkrementell utveckling av programvarukonfigurationer ICSE-NIER ‘22: Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results, maj 2022
Ett ljud och optimalt inkrementellt byggsystem med dynamiska beroenden OOPSLA 2015: Proceedings of the 2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, and Applications oktober 2015
