Linux היא הפלטפורמה היחידה שבה משתמשי Chrome יכולים להתקין תוספים שמתארחים מחוץ לחנות האינטרנט של Chrome. במאמר הזה מוסבר איך לארוז, לארח ולעדכן קובצי crx
משרת אינטרנט לשימוש כללי. אם אתם משווקים תוסף או עיצוב רק דרך חנות האינטרנט של Chrome, כדאי לעיין במאמר אירוח ועדכון בחנות האינטרנט.
חבילה
תוספים ועיצובים מוצגים כקובצי .crx
. כשמעלים דרך מרכז השליטה למפתחים של Chrome, קובץ crx
נוצר באופן אוטומטי במרכז השליטה. אם הקובץ crx
פורסם בשרת אישי, צריך ליצור אותו באופן מקומי או להוריד אותו מחנות האינטרנט של Chrome.
מורידים קובץ .crx מחנות האינטרנט של Chrome
אם תוסף מתארח בחנות האינטרנט של Chrome, אפשר להוריד את הקובץ .crx
ממרכז השליטה למפתחים. מאתרים את התוסף בקטע 'הכרטיסיות שלך' ולוחצים על 'מידע נוסף'. בחלון הקופץ, לוחצים על הקישור הכחול main.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"
"\*/\*"
- הקובץ לא מוצג עם כותרת ה-HTTP
הסיבה הנפוצה ביותר לכך שלא ניתן לזהות קובץ שניתן להתקנה היא שהשרת שולח את הכותרת X-Content-Type-Options: nosniff
. הסיבה השנייה הנפוצה ביותר היא שהשרת שולח סוג תוכן לא ידוע – סוג שלא מופיע ברשימה הקודמת. כדי לפתור בעיה בכותרת HTTP, אפשר לשנות את ההגדרות של השרת או לנסות לארח את הקובץ .crx
בשרת אחר.
עדכון
כל כמה שעות הדפדפן בודק אם בתוספים המותקנים יש כתובת URL לעדכון. לכל אחת מהן, המערכת שולחת בקשה לכתובת ה-URL הזו כדי לחפש קובץ XML של מניפסט עדכון.
- התוכן שמוחזר על ידי בדיקת עדכון הוא מסמך XML של מניפסט עדכון שמפרט את הגרסה העדכנית ביותר של התוסף.
אם במניפסט העדכון מופיעה גרסה עדכנית יותר מהגרסה המותקנת, הדפדפן מוריד ומתקין את הגרסה החדשה. בדומה לעדכונים ידניים, קובץ .crx
החדש צריך להיות חתום באותו מפתח פרטי כמו הגרסה המותקנת כרגע.
עדכון כתובת 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 ואילך.