עברתי על הרבה מאוד מחוללי אתרים סטטיים, והגעתי להבנה מאוד רעה: או שהם מפלצתיים מסובכים ומסורבלים מאוד, או שהם פשוטים מאוד אבל נכתבו למטרה מאוד ספציפית, לרוב עבור יצירת בלוג.
השקעתי יום וקצת למשל במה שמאיר כתב עבור הבלוג שלו, ואפילו פתחתי לו 11 באגים, שמספר מהם כבר סודרו (המשך כך מאיר), אבל גם המחולל שלו, שמאוד פשוט (מקדימה, לא מאחורה), בנוי להיות בלוג. אבל אני רוצה להיות אתר עם דפים סטטיים, ולא בלוג. זה אומר כי כל הטיפול ב routing ובגישה בכללותה של איך עובדים עם התוכן מושפעת מזה. ובשביל לגרום למחולל שלו להיות כללי יותר נדרש יותר עבודה.
אז בצער רב וביגון קודר, התחלתי ליצור עוד מחולל סטטי משל עצמי. משהו שמאוד לא רציתי לעשות. השקעתי כמעט שבוע במחקר רק בשביל להימנע מזה. ובכל זאת 😦
ביום הראשון להתחלתי, תכננתי איך השלד נראה, כתבתי ספסיפיקציה (עדיין לא שלמה) איך התוכן יראה לפני היצירה שלו כדף html, מצאתי המון ספריות שיודעות להמיר markup זה או אחר לhtml ובחרתי דווקא משהו שכתוב ב haskell (שימוש ראשון שלי למשהו שכתוב בשפה) אבל עם המון פוטנציאל וכוח שנקרא Pandoc . יש לו אפילו wrapper ברובי שאני משתמש לפרוייקט, וקפצתי למים העכורים של משהו שכל כך שנוא עלי – להמציא את הגלגל מחדש בפעם המליארד.
ואז נתקלתי במספר בעיות. איך אני מריץ קוד רובי שצריך להשתמש בספרייה שתגיע בתור gem ? בברירת מחדל, אם זה לא מותקן, אז אין לי דרך להגיד לרובי את המיקום של הקבצים. בסוף מצאתי לזה פתרון די פשוט, אבל לקח זמן להגיע אליו:
$BASE_PATH = File.expand_path(File.dirname(__FILE__) + '/..')
לאחר מכן, נתקלתי בעוד בעיות.
למשל היתה בעיה איך אני גורם לקובץ הריצה למצוא את Gemfile כאשר אני לא רץ בספרייה שהוא נמצא בה.
חיפוש וחפירה בהרבה מאוד קוד, גילה שיש רק דרך אחת לעשות זאת, וזה להשתמש ב environment variable של bundler בשם BUNDLE_GEMFILE :
require 'bundler' ENV["BUNDLE_GEMFILE"] = $BASE_PATH + '/Gemfile' Bundler.require(:default)
ועכשיו הוא יכול לעבוד כמו שצריך.
בעיה נוספת שנתקלתי בה, היא ניתוח של הפרמטרים לcli שרציתי.
יש לרובי ספרייה ממש נחמדה שמגיעה כחלק ממנו, אבל היא לא בנויה למה שחיפשתי.
אז חיפשתי משהו אחר, ומצאתי את slop. די נחמד. עדיין עובד קשה קצת, אבל פחות ממה שמגיע עם רובי עבור הצורך שלי.
יותר מאוחר גיליתי ספרייה טובה יותר, אבל רק בגרסה הבאה של מה שאני יוצר אעבור אליו, וזה נקרא Thor. היא נבנתה באמת למה שאני צריך, אבל גיליתי אותה בשלב שהחלטתי כבר להתמקד בעיקר קודם כל.
נכון לכתיבת הפוסט, היו עוד כמה בעיות שנתקלתי בהן, אבל פתרתי אותן די בקלות. בנתיים.
זה מאוד מעניין לראות כמה תכנות פריימוורק כזה דורש גישה וחשיבה שונה.
אני לומד מזה המון, אבל חבל שעם פרוייקט כזה.
חשוב לי עוד להדגיש כי נכון לכתיבת הפוסט, עדיין המערכת לא בנויה לשימוש נרחב, הקרנל אפילו עדיין לא מומש, ובנוסף היא ועוברת המון שינויים כולל בתכנון שלה, ובדרכי העבודה, כך שעד שלא אפרסם כאן שזה מוכן, תהיו צריכים לחכות בסבלנות.
אפשר שאלה,
למה צריך "מחולל אתרים סטטיים", מה טוב בזה? שלא ניתן להגיב בו או לעדכן אותו?
דף או תוכן שלא מתעדכן כל הזמן, אין סיבה שיטען בצורה דינאמית. זה לוקח הרבה משאבים, חשוף להרבה בעיות אבטחה וביצועים.
כל דבר שאינו צריך התערבות דינאמית עדיף שיהיה כמה שיותר קל ונוח, ואז אתה גם לא צריך לעבוד קשה על מה שלא חייבים.
למעט העובדה שאם אתה רוצה לשנות נגיד עיצוב או משהו קטן אחר בכל הדפים אתה צריך לחוללת את כל האתר מחדש. לגבי הביצועים? ברצינות. אם הסיבה היא ביצועים, זה נשמע כמו פתרון של שנות ה-90. בשביל מה יש מערכות cache?!
טוב אולי זה בגלל שאני רגיל למהירות CppCMS אז שימוש בקבצים סטטיים כפתרון לביצועים זה נשמע כמו משהו ביזארי.
לא רק מהירות, כמו שאמרתי גם מטפל בבעיות אבטחה.
אבל אתה שוכח שפריסה עכשיו של CppCMS היא כאב ראש. זה לא להעתיק פשוט משרת אחד למישנהו, זה פרוייקט.
יש לך תלויות, גרסאות שונות, באגים במערכת שיכולים למנוע ממך עבודה טובה, ועוד.
אם אני רוצה לשנות עיצוב קטן, המחולל עדיין יעשה את השינוי, זה בדיוק העניין. הוא פשוט יצור מחדש את הקבצים שצריך ליצור.
כמו כן, מה קורה אם עכשיו עברת משרת לינוקס לשרת ווינדוז ?
מה קורה אם יש לך כרגע תקלה עם מסד נתונים ?
כל אלו ועוד המון דברים אחרים, כאשר אין לך באמת צורך לשנות כלום, סתם מכניסים לך עוד בעיות, ועוד כאב ראש.
ד"א דף סטטי מהיר יותר מCppCMS 😛
ביצועים,
אבטחה,
תאימות לכל שרתי ה-http,
אין צורך בתקשורת נוספת לתליכי fcgi או reverse proxy
אין צורך ב-cache ובזבוז זכרון,
מעבר בין שרתים ומארחים שקוף ומיידי,
אין בעיות עם גרסאות תוכנה וחבילות שונות משונות,
אין תחזוקה של בסיסי נתונים (גיבוי, בעיות אבטחה, זכרון).
לא הבנתי מה זה בדיוק פריימוורק (תשתית?) בהקשר הזה? עוד תוכנית?
מאפשר לך בלי להתעסק בתכנות, אלא רק עם הגדרות (נקודתיות וכלליות) ליצור אתר סטטי, כאשר הידע שלך אפילו לא חייב להיות ב html, אלא איך לכתוב markup כדוגמת markdown ו reStructuredText.
הוא אמור להכיל תכונות שונות, שכרגע עוד רחוקות לגרסה הזו, וזה בראש ובראשונה נועד גם לפתור מה שלי חסר בכלים קיימים.
כלומר: כן. תוכנית. ואני דווקא חשבתי ש"פריימוורק" אמור להיות משהו שמיועד לתוכניתנים (כלומר: ספריה, כלי עזר). תודה על תיקון המינוח.
הפירוש המילוני של פריימוורק (שאני מכיר ולכן השתמשתי במונח):
/ˈfrāmˌwərk/
Noun
1. An essential supporting structure of a building, vehicle, or object.
2. A basic structure underlying a system, concept, or text: "the theoretical framework of political sociology".
לקוח מגוגל ד"א, כשאתה כותב "define framework" ללא הגרשיים כחיפוש.