נצפה לאחרונה
נצפה לאחרונה

מה זה Smart Content Dependency Management™ הכל אודות?

[סקירהטכנית] עודכן לאחרונה מאת Joe Schaefer ב-יום ו׳, 12 יוני 2026    מקור
 

עץ

תוכן עניינים


מופשט

ניהול תלות של תוכן חכם™ הוא על מעגל הרעיונות הקשורים למתן תמיכה והנחיה עבור בניות תוספתיות, תוך שמירה על נאמנות ל עיקרון נורמליזציה של תוכן — אשר קישורים רשמיים צריך להיות מקור האמת היחיד, לא משנה איך התוכן שלהם נאסף בכל עץ המקור וכתוצאה מכך לבנות חפצים.

מאמר זה מציג את https://iconoclasts.blog/ אתר אינטרנט כמקרה בוחן להדגמה של שיטות עבודה מומלצות וניתוח של טופולוגיות הגרפים הקשורות.


מערות

זה חשוב רק כאשר אתה צריך לשקול את העלות של ביצוע בניית אתר מלא בכל פעם שאתה צריך לצבוט את התוכן בדף אינטרנט. אם אתר האינטרנט שלך מכיל פחות מ-1K קבצי מקור, relax, ולקרוא את הדברים הבאים עם עין לצרכים העתידיים שלך. בחרת להשתמש בפלטפורמה שלנו, שנועדה להתרחב איתך, לא נגדך. עבור רוב הדפים, חומר זה להלן הוא על גרפים של תלות בתוכן sparse לאתרים עם יותר מ-1K דפים.

לדוגמה, אפאצ’י https://www.OpenOffice.Org האתר היה מסוגל לבנות את קבצי 40K+ שלו באמצעות גרסת Apache המקורית של מערכת בנייה זו, עם תמיכה משולבת לחלוטין עבור בנייה תוספתית — ללא יחסי תלות מוגדרים כלשהם — על ידי שימוש חכם של טכנולוגיית SSI מסורתית בלבד.

כברירת מחדל, מערכת הבנייה שלנו תבנה רק את הקבצים ששינית, ללא חשש ליחסי התלות בתוך הקובץ (אלא אם תציין אותם ב- %path::dependencies — עוד על זה למטה). אם הקובץ ששינית נמצא ב- templates/ או lib/ ספרייה, בניית אתר מלאה תוזנק במקום זאת.


אריגת גרף התלות של האתר שלך* ביחד

מתמטית, טופולוגיה τ\tau הוא מפרט שלם של תת-קבוצות פתוחות של מרחב XX, שמטרתו היא לציין את קשרי הקרבה בין נקודות xx של החלל XX. מתי XX הוא גרף, טופולוגיה τ\tau עבור XX סכומים לציון הקצוות המחברים את הקודקודים של התרשים יחד (כאן קודקודים מוצגים כנקודות *של XX, והקצוות המחברים קובעים את השכונות של נקודות אלה כ”ערכות פתוחות בסיס” עבור הטופולוגיה. טופולוגיית גרף מכוונת היא בעצם אותו הדבר, אבל משלבת התייחסות לשיבוץ טופולוגי של (X,τ)(X,\tau) לתוך מרחב טופולוגי גדול יותר (Y,σ)(Y,\sigma) , כאשר חיבורי הקצה של השיבוץ מיוצגים על-ידי עקומות כיווניות ללא חיתוך (ירדן).

הרעיון האחרון הוא מה נשתמש כאשר נדון בטופולוגיה* של גרף התלות τ\tau מקושר למרחב XX של קובצי מקור מתחת לאתר האינטרנט שלך content/ תת ספרייה (כאן) (Y,σ)(Y,\sigma) הוא Rn\mathbb{R}^n עם הטופולוגיה של n{2,3}n \in \{2,3\}ואת הקצוות של XX הם עקומות ירדן מכוונות שאינן חיתוך, המחברות קובץ xXx \in X אל קבוצת הקבצים שעליה xx תלוי: {xXxx}\set{x^\prime \in X | x \rightarrow x^\prime}).

להיות הבנה ברורה של גרף התלות* של אתר האינטרנט שלך תבטיח שתוכל למקסם את הביצועים של טכנולוגיית הבנייה שלנו בקנה מידה גדול. אנו לוקחים את המידע שאתה מספק כדי %path::dependencies במהלך עומס הבנייה של האתר שלך lib/path.pm קובץ, בנה מפה הפוכה של קבצים תלויים, והשתמש ב-אותה מפה הפוכה כדי לקבוע את מאגר הקבצים המלא שיש לבנות עבור כל נתון svn commit אתה יוצר את המערכת שלנו.

חשוב לציין שקשרי התלות בין קובצי מקור יכולים וצריכים להילכד במלואם על-ידי %path::dependencies גיבוב במהלך עומס האתחול של מערכת הבנייה lib/path.pm מעץ המקור שלך, כך התצוגות המובנות הכלולות בנו SunStarSys::View החבילה אמורה לפעול. דה walk_content_tree, archived, וגם seed_file_deps פונקציות תוכנית שירות שניתן לייבא מ- SunStarSys::Util הם עזרי שימוש בבניית %path::dependencies גיבוב, עם תמיכה מובנית לניהול מטמון תלות כדי להאיץ בנייה תוספתית בקנה מידה.

הנה החלק הזה של החיים שלנו lib/path.pm:

walk_content_tree {

  $File::Find::prune = 1, return if m#^/(images|css|js)\b#;

  return if -d "content/$_";

  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{$_}++;
    }
  };

אנא בצע mull את הקוד הזה לרעיונות על איך אתה רוצה האתר שלך לעבוד. כן, יש מורכבות סבירה כלשהי (הופעת הביטויים הרגילים של פרל וגליפת יוניקס C של פרל) glob ממשקים, באופן מדויק מאוד) סביב איך %path::dependencies הוא בנוי בקובץ זה, אבל במקום רק לראות את זה כמו אופטימיזציה עבודה, במקום להסתכל על זה כמו לספק את המרכיבים הבסיסיים הדרושים כדי להגביל את ההיבטים העיקריים של הטופולוגיה קישור באופן אוטומטי, שנוצר באופן דינמי.

היכן רשומות ב- %path::dependencies מקור? אם הם לא נולדו מתוך קריאה של walk_content_tree { seed_file_deps ... }, (אשר בעצם צולל לתוך הכותרות והתוכן של קובצי מקור הסימון שלך), אז הם פשוט מקודדים קשה לתוך lib/facts.yml בזמן טעינה.

גרפים של תלות מעגלית הם הנורמה

האתר שלנו מורכב מ 2417 source files בתוך content/. הנה אחד 100+ vertices x 600+ edges, ייצוג גרף מונחה דו-ממדי ניתן לגלילה של תמונת מצב עדכנית של יחסי התלות של הדף בשפה האנגלית באתר This site (שימוש ב-GraphViz dot):

יחסי תלות בשפה האנגלית

די מורכב, אפילו עבור אתר קטן כזה! חיתוכי קצוות רבים כאשר לוקחים n=2n=2 (בלתי נמנע בממד) n=3n=3). הערה מסוימת היא קבוצת הליבה של יחסי תלות צפופים ומעגליים בקבצים שאינם בארכיון באתר שלנו. /essays/ ספרייה, לכיוון מרכז-ימין התחתון של הגרף, וזה מה גרף התלות של אתר בלוגים טוב צריך להיראות. יחסי תלות אלה נמשכים ב red curves בתמונה.

כמו כן שים לב לחיבור הפנימי, המבודד ביסודו של דבר של האלמנטים ב /categories/*/* וגם /archives/2026/05/*. יחסי התלות החיצוניים היחידים כוללים תוכן שלא הועבר לארכיב ב- /joe/*. זה על ידי עיצוב — המאמרים שהועברו לארכיון אמורים להשתנות רק בצורה “אדיאבטית”, אולי רק לצורך התאמות שלהם. Category כותרות. אף אחד מהשינויים האלה לא משפיע באופן מהותי על התוכן הקיים, ולכן אנחנו לא עוקבים אחריו %path::dependencies.

כמובן, שלנו Wiki של ארגון אוריון מעולם לא התקשה להתמודד עם תלות מעגלית.

האם לא מדובר רק בהיפר-קישורים?

לא! למעשה, טופולוגיית הקישור של האתר שלך היא עניין נפרד לחלוטין מגרף התלות של עץ המקור*. מנוע חיפוש יהיה באופן טבעי לפרוס את טופולוגיית הקישור *, אבל אין לו תובנה על גרף התלות *.

הנה a 16k+ vertices x 90k+ edges, גרף עופות-עיניים נוכחי של אנגלית טופולוגיה קישור גרף עבור האתר שלנו (שימוש ב-GraphViz twopi):

אתה יכול לזהות את red edges כפי שצוין בתרשים התלות ? גרף טופולוגיית הקישור הוא איכותי וכמותי שונה מאוד מגרף התלות (קטן באופן דרמטי ופחות מחובר) המתואר לעיל.

כיצד טכנולוגיית SSI יכולה לעזור

מסורתי כולל בצד השרת (SSI)

  • מצוין עבור גיזום גרף התלות של אתר האינטרנט שלך עד לגודל ניתן לניהול מבלי להקריב את זמן ההמתנה למסירת דף
  • גדול להקטנת נטישת הטקסט הסטנדרטי בהודעות commit גדולות, לצורך סקירה ופיקוח טובים יותר על ערכות השינויים המובנות שלך
  • lousy לצורך חיבור מחדש של דפי אינטרנט שלמים למיקום אחר בהיררכיית שורש המסמך שלך

ממשקי API לתבנית

תגית ssi

Syntax:

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

  • נתיבים מושרשים ב content ספריית מקור
  • מדלג על חלק הכותרת של קובץ המקור להיות ssi כלול
  • משכתב כתובות url יחסיות לכתובות url מוחלטות בתוכן הכלול של נתיב היעד
מסנן ssi

Syntax:

{{ תוכן|ssi }}

הערכה רקורסיבית ssi תגיות בערך שיש לסנן

  • שימושי כדי להימנע משימוש בערך גדול (3+) של quick_deps בתוך @path::patterns hashref של ארגומנט הרשומה, שיכול להשפיע על הביצועים
  • אבסטרקציה מערכת קבצים Barebones כי קשה לתמוך בצורה מאובטחת <VirtualHost> הקשר
    אותם חסרונות עם מסורתי ssi בדפי אינטרנט מלאים
    שלנו Wiki של ארגון אוריון המערכת לא תומכת בהם

בניית כלים לקישורים קבועים

אוצרות מסמך

מערכת הבנייה של אוריון כוללת תמיכה משולבת במה שאנו מכנים “איסוף מסמכים”, שהוא תהליך של יצירת הקשר מחדש וארגון מחדש של התוכן שלך על סמך האופן שבו אתה מגדיר את התוכן. Categories וגם Status כותרות בקובצי המקור Markdown שלך. תכונות אלו מושבתות כברירת מחדל, אך ניתן להפעיל אותן באמצעות הגדרת category_root (לתמיכה בקטגוריה) או archive_root (לתמיכה בארכיב) בארגומנט hashref המקושר לרצוי @path::patterns כניסה.

קטגוריות
  • תוכן חדש נבנה באמצעות תבנית ssi תגיות המצביעות בחזרה למיקום קישור קבוע,
  • הקטגוריות מוספות בקפדנות (כלומר, הסרת קטגוריה מכותרות דף המקור לא תסיר אותה מאותה קטגוריה באתר החי),
    נוצר לפי דרישה,
  • מחיקת כל הקטגוריות ב-commit יחיד היא דרך מצוינת לסנכרן אותן עם המפרטים המדויקים בכל כותרות דפי המקור, מבלי להרוס את תוכן הקטגוריה המשומר באתר החי.
דפים שהועברו לארכיב

באתר שלנו, אנו מאחסנים באופן אגרסיבי מאמרים מיושנים כדי לשמור על זמני בנייה עבור מאמרים חדשים נמוכים, תוך לא להרוס permalinks למסמכים בארכיון. גרף התלות יחסית ל- /archives/ מדריך (עבור האתר שלנו) הוא באופן סביר עצמאי על פי הכללים הבאים:

  • תוכן שנבנה באמצעות תבנית ssi תגיות שמצביעות בחזרה למיקום קישור קבוע, בעת הסרת Categories כותרת מהדף מקור בנוי
  • תוכן ב- /(essays|clients)/ הם תמיד קישור קבוע, גם לאחר הארכיון
  • העברה לארכיב מסירה ביעילות את המיקום קישור קבוע מהגרף תלות, מבלי להסיר את הקישור הקבוע עצמו מהאתר.
לד

הערות HTML המשובצות בגבולות הטופס Markdown prose של תוכן ה- lede. אנו משתמשים {מס’ הוביל} למטרה זו.

עיבוד רמזי מכירה נעשה עם lede מסנן תבניות. כדאי לשלב את זה עם ssi מסנן למפתוח קובץ קטגוריה עם יותר מדף קטגוריה אחד בתוכו.


מסקנות

ישנם מבני נתונים מעניינים ויחסים שעדיין לא נחשפו כאשר מתמודדים עם גרף התלות של אתר אינטרנט* מנקודת מבט של ביצועי בנייה, המהווה תחום עניין חדש הרבה יותר מאשר ספרות המחקר המתעמקת במבני הנתונים והנפקות הקשורות סביב טופולוגיית קישור1,2.

גרסאות מצטברות קונבנציונליות לפרויקטים של פיתוח תוכנה טהורים הן עדיין נושא חם. המחקר מכסה 3,4 פורסם באוקטובר 2022, כחודש לפני שהמאמר צפוי להסתיים. פלוטו*5 למערכת הבנייה יש תכונות די דומות לשלנו (הבנייה עצמה יכולה ליצור מחדש ולבנות מחדש באופן דינמי יחסי תלות).

החדשות הטובות הן שאנחנו מכסים אותך כלקוח שלנו. אנו נשמור אותך מעודכן לגבי שיטות העבודה המומלצות ומצב האמנות במרחב זה, כך שתיהנה מהשיעורים שלנו שנלמדו בעשור האחרון ומחר.


מס’ הערות שוליים

  1. זיהוי אשכולות בתרשים האינטרנט בהתבסס על טופולוגיית קישורים סימפוזיון ההנדסה והיישומים הבינלאומי השביעי, 2003. הליכים.

  2. הסקת קהילות אינטרנט מטופולוגיית קישורים ההליכים של כנס ACM התשיעי בנושא היפרטקסט והיפר-מדיה: קישורים, אובייקטים, זמן ומרחב — מבנה במערכות היפר-מדיה: קישורים, אובייקטים, זמן ומרחב — מבנה במערכות היפר-מדיה, 1998.

  3. על היתרונות והמגבלות של תצורות תוכנת בנייה תוספתית: מחקר חקרני ICSE ‘22: הליכי הוועידה הבינלאומית ה-44 להנדסת תוכנה, מאי 2022

  4. לקראת בנייה מצטברת של תצורות תוכנה ICSE-NIER ‘22: הליכים של ACM / IEEE 44 כנס בינלאומי על הנדסת תוכנה: רעיונות חדשים ותוצאות מתפתחות, מאי 2022

  5. מערכת קול ובנייה תוספתית אופטימלית עם תלות דינמית OOPSLA 2015: ההליכים של כנס ACM SIGPLAN הבינלאומי לשנת 2015 בנושא תכנות מונחה-אובייקטים, מערכות, שפות ויישומים אוקטובר 2015