אירוח עצמי ל-Linux

Linux היא הפלטפורמה היחידה שבה משתמשי Chrome יכולים להתקין תוספים שמתארחים מחוץ לחנות האינטרנט של Chrome. במאמר הזה מוסבר איך לארוז, לארח ולעדכן קובצי crx משרת אינטרנט לשימוש כללי. אם אתם משווקים תוסף או עיצוב רק דרך חנות האינטרנט של Chrome, כדאי לעיין במאמר אירוח ועדכון בחנות האינטרנט.

חבילה

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

מורידים קובץ ‎ .crx מחנות האינטרנט של Chrome

אם תוסף מתארח בחנות האינטרנט של Chrome, אפשר להוריד את הקובץ .crx ממרכז השליטה למפתחים. מאתרים את התוסף בקטע 'הכרטיסיות שלך' ולוחצים על 'מידע נוסף'. בחלון הקופץ, לוחצים על הקישור הכחול main.crx כדי להוריד אותו.

מורידים את הקובץ ‎ .crx ממרכז השליטה למפתחים

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

יצירת קובץ ‎ .crx באופן מקומי

ספריות תוספים מומרות לקובצי .crx בדף 'ניהול תוספים'. מנווטים אל chrome://extensions/ בסרגל הכתובות או לוחצים על תפריט Chrome, מעבירים את העכבר מעל ל'כלים נוספים' ובוחרים באפשרות 'תוספים'.

בדף 'ניהול התוספים', מפעילים את מצב הפיתוח בלחיצה על המתג לצד מצב פיתוח. לאחר מכן בוחרים בלחצן PACK EXTENSION.

מסמנים את התיבה שליד 'מצב פיתוח' ולוחצים על 'אריזת התוסף'.

מציינים את הנתיב לתיקיית התוסף בשדה של ספריית הבסיס של התוסף ולוחצים על הלחצן PACK Extension. אם מדובר בחבילה ראשונה, מתעלמים מהשדה Private key.

מציינים את נתיב התוסף ולוחצים על 'אריזת התוסף'.

Chrome ייצור שני קבצים, קובץ .crx וקובץ .pem, שמכילים את המפתח הפרטי של התוסף.

קובצי הרחבה ארוזים

אסור לאבד את המפתח הפרטי! שומרים את הקובץ .pem במקום סודי ומאובטח. הוא יצטרך לעדכן את התוסף.

עדכון של חבילת .crx

כדי לעדכן את קובץ ה-.crx של תוסף, צריך להגדיל את מספר הגרסה בקובץ manifest.json.

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

חוזרים אל דף ניהול התוספים ולוחצים על הלחצן PACK Extension. מציינים את הנתיב לספריית התוספים ואת המיקום של המפתח הפרטי.

עדכון קובצי ההרחבה

בדף יופיע הנתיב לתוסף האריזה המעודכן.

עדכון קובצי ההרחבה

חבילה באמצעות שורת פקודה

כדי לארוז תוספים בשורת הפקודה, מריצים את הפקודה chrome.exe. משתמשים בדגל --pack-extension כדי לציין את המיקום של התיקייה של התוסף, ובדגל --pack-extension-key כדי לציין את המיקום של קובץ המפתח הפרטי של התוסף.

chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

מארח

שרת שמארח קובצי .crx חייב להשתמש בכותרות HTTP מתאימות כדי לאפשר למשתמשים להתקין את התוסף בלחיצה על קישור.

מערכת Google Chrome מתייחסת לקובץ כקובץ שניתן להתקנה אם אחד מהתנאים הבאים מתקיים:

  • סוג התוכן של הקובץ הוא application/x-chrome-extension
  • הסיומת של הקובץ היא .crx ושני התנאים הבאים מתקיימים:
    • הקובץ לא מוצג עם כותרת ה-HTTP X-Content-Type-Options: nosniff
    • הקובץ מוצג עם אחד מסוגי התוכן הבאים:
    • מחרוזת ריקה
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

הסיבה הנפוצה ביותר לכך שלא ניתן לזהות קובץ שניתן להתקנה היא שהשרת שולח את הכותרת X-Content-Type-Options: nosniff. הסיבה השנייה הנפוצה ביותר היא שהשרת שולח סוג תוכן לא ידוע – סוג שלא מופיע ברשימה הקודמת. כדי לפתור בעיה בכותרת HTTP, אפשר לשנות את ההגדרות של השרת או לנסות לארח את הקובץ .crx בשרת אחר.

עדכון

כל כמה שעות הדפדפן בודק אם בתוספים המותקנים יש כתובת URL לעדכון. לכל אחת מהן, המערכת שולחת בקשה לכתובת ה-URL הזו כדי לחפש קובץ XML של מניפסט עדכון.

  • התוכן שמוחזר על ידי בדיקת עדכון הוא מסמך XML של מניפסט עדכון שמפרט את הגרסה העדכנית ביותר של התוסף.

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

הערה: כדי לשמור על פרטיות המשתמשים, Google Chrome לא שולח כותרות של קובצי Cookie עם בקשות מניפסט לעדכון אוטומטי, ומתעלם מכותרות Set-Cookie בתשובות לבקשות האלה.

עדכון כתובת URL

תוספים שמתארחים בשרתים מחוץ לחנות האינטרנט של Chrome חייבים לכלול את השדה update_url בקובץ manifest.json.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

עדכון המניפסט

מניפסט העדכון שהשרת מחזיר צריך להיות מסמך XML.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

פורמט ה-XML הזה הוא פורמט ששימש את Omaha, תשתית העדכונים של Google. מערכת התוספים משתמשת במאפיינים הבאים לרכיבים <app> ו-<updatecheck> במניפסט העדכון:

appid
מזהה התוסף נוצר על סמך גיבוב (hash) של המפתח הציבורי, כפי שמתואר בקטע אריזה. המזהה של התוסף מוצג בדף 'ניהול התוספים'.
codebase
כתובת URL מסוג HTTPS לקובץ .crx.
גרסה
הלקוח משתמש בו כדי לקבוע אם להוריד את קובץ ה-.crx שצוין על ידי codebase. הערך צריך להתאים לערך של 'version' בקובץ manifest.json של הקובץ .crx.

קובץ ה-XML של מניפסט העדכון יכול להכיל מידע על כמה תוספים על ידי הכללת כמה רכיבי <app>.

בדיקה

תדירות בדיקת העדכונים שמוגדרת כברירת מחדל היא כמה שעות, אבל אפשר לאלץ עדכון על ידי לחיצה על הלחצן Update extensions now (עדכון תוספים) בדף ניהול התוספים.

לעדכון התוספים

הפעולה הזו תגרום להתחלת בדיקות של כל התוספים המותקנים.

שימוש מתקדם: פרמטרים של בקשות

מנגנון העדכון האוטומטי הבסיסי נועד לאפשר את העבודה בצד השרת בקלות, כמו רק שחרור קובץ XML סטטי בכל שרת אינטרנט פשוט, כמו Apache, ועדכון קובץ ה-XML לאחר פרסום גרסאות סיומות חדשות.

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

הפורמט של הפרמטרים של הבקשה הוא:

?x=EXTENSION_DATA

כאשר EXTENSION_DATA היא מחרוזת בקידוד כתובת URL בפורמט:

id=EXTENSION_ID&v=EXTENSION_VERSION

לדוגמה, שני תוספים מפנים לאותה כתובת URL של עדכון (https://test.com/extension_updates.php):

  • תוסף 1
    • מזהה: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    • גרסה: '1.1'
  • תוסף 2
    • מזהה: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • גרסה: '0.4'

הבקשה לעדכון של כל תוסף בנפרד תהיה,

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1

וגם

https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

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

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

אם מספר התוספים המותקנים שמשתמשים באותה כתובת URL לעדכון גדול מספיק וכתובת ה-URL של בקשת ה-GET ארוכה מדי (יותר מ-2,000 תווים בערך), בדיקת העדכון תיצור בקשות GET נוספות לפי הצורך.

שימוש מתקדם: הגרסה המינימלית של הדפדפן

ככל שמוסיפים יותר ממשקי API למערכת התוספים, יכול להיות שתפורסם גרסה מעודכנת של תוסף שתעבוד רק בגרסאות חדשות יותר של הדפדפן. Google Chrome מתעדכן באופן אוטומטי, אבל יכול להיות שיחלפו כמה ימים עד שרוב בסיס המשתמשים יתעדכן לגרסה החדשה. כדי להבטיח שעדכון מסוים יחול רק על גרסאות Google Chrome בגרסה ספציפית או גרסאות מתקדמות יותר, צריך להוסיף את המאפיין prodversionmin לרכיב <app> בתגובת העדכון.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
  </app>
</gupdate>

כך תוכלו לוודא שהמשתמשים יקבלו עדכון אוטומטי לגרסה 2 רק אם הם משתמשים ב-Google Chrome בגרסה 3.0.193.0 ואילך.