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
, arkiverad
och 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öjd
källkatalog - hoppar över huvuddelen av källfilen som ska
ssi
ingå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
ssi
taggar i värdet som ska filtreras - användbar för att undvika att använda ett stort värde (3+) av
quick_deps
i en@path::mönster
inmatningens 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
ssi
på 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
ssi
taggar som pekar tillbaka till permalänkplatsen, medan du tar bortArkivera
sidhuvud 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
ssi
taggar som pekar tillbaka till permalänkplatsen, medan du tar bortKategorier
ochArkivera
rubriker 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