Linux के लिए खुद होस्ट करें

Linux अकेला ऐसा प्लैटफ़ॉर्म है जहां Chrome उपयोगकर्ता, Chrome वेब स्टोर के बाहर होस्ट किए गए एक्सटेंशन इंस्टॉल कर सकते हैं. इस लेख में, अलग-अलग कामों के लिए इस्तेमाल किए जाने वाले वेब सर्वर से crx फ़ाइलों को पैकेज करने, होस्ट करने, और अपडेट करने का तरीका बताया गया है. अगर आपको कोई एक्सटेंशन या थीम सिर्फ़ Chrome Web Store के ज़रिए उपलब्ध करानी है, तो वेबस्टोर को होस्ट करने और अपडेट करने की जानकारी देखें.

पैकेज

एक्सटेंशन और थीम .crx फ़ाइलों के तौर पर काम किए जाते हैं. Chrome डेवलपर डैशबोर्ड से अपलोड करने पर, डैशबोर्ड अपने-आप crx फ़ाइल बना देता है. अगर निजी सर्वर पर पब्लिश किया गया है, तो crx फ़ाइल को डिवाइस पर बनाया जाना चाहिए या Chrome Web Store से डाउनलोड किया जाना चाहिए.

Chrome Web Store से .crx डाउनलोड करें

अगर किसी एक्सटेंशन को Chrome Web Store पर होस्ट किया गया है, तो .crx फ़ाइल को 'डेवलपर डैशबोर्ड' से डाउनलोड किया जा सकता है. "आपकी लिस्टिंग" में एक्सटेंशन ढूंढें और "ज़्यादा जानकारी" पर क्लिक करें. पॉप-अप विंडो में, नीले रंग के main.crx लिंक पर क्लिक करके, उसे डाउनलोड करें.

डेवलपर डैशबोर्ड से .crx डाउनलोड करें

डाउनलोड की गई फ़ाइल को निजी सर्वर पर होस्ट किया जा सकता है. यह किसी एक्सटेंशन को स्थानीय रूप से होस्ट करने का सबसे सुरक्षित तरीका है, क्योंकि एक्सटेंशन के कॉन्टेंट को Chrome Web Store से हस्ताक्षर किया जाएगा. इससे, संभावित हमलों और छेड़छाड़ का पता लगाने में मदद मिलती है.

स्थानीय तौर पर .crx फ़ाइल बनाएं

एक्सटेंशन मैनेजमेंट पेज पर, एक्सटेंशन डायरेक्ट्री को .crx फ़ाइलों में बदल दिया जाता है. खोज बार में chrome://extensions/ पर जाएं या Chrome मेन्यू पर क्लिक करें, पॉइंटर को "ज़्यादा टूल" पर दबाकर रखें और फिर "एक्सटेंशन" चुनें.

एक्सटेंशन मैनेजमेंट पेज पर, डेवलपर मोड के बगल में मौजूद टॉगल स्विच पर क्लिक करके, डेवलपर मोड चालू करें. इसके बाद, पैक एक्सटेंशन बटन चुनें.

डेवलपर मोड को चेक किया गया है और फिर पैक एक्सटेंशन पर क्लिक करें

एक्सटेंशन रूट डायरेक्ट्री फ़ील्ड में एक्सटेंशन के फ़ोल्डर का पाथ तय करें. इसके बाद, पैक एक्सटेंशन बटन पर क्लिक करें. पहली बार मिलने वाले पैकेज के लिए, निजी पासकोड फ़ील्ड को अनदेखा करें.

एक्सटेंशन पाथ तय करें और फिर पैक एक्सटेंशन पर क्लिक करें

Chrome दो फ़ाइलें बनाएगा, .crx फ़ाइल और एक .pem फ़ाइल, जिसमें एक्सटेंशन की निजी कुंजी होगी.

पैकेज की गई एक्सटेंशन फ़ाइलें

निजी कुंजी को खोने न दें! .pem फ़ाइल को किसी गुप्त जगह पर और सुरक्षित जगह पर रखें. इसे एक्सटेंशन को अपडेट करने की ज़रूरत होगी.

.crx पैकेज अपडेट करें

manifest.json में वर्शन नंबर बढ़ाकर, एक्सटेंशन की .crx फ़ाइल अपडेट करें.

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

एक्सटेंशन मैनेजमेंट पेज पर वापस जाएं और एक्सटेंशन पैक करें बटन पर क्लिक करें. एक्सटेंशन डायरेक्ट्री का पाथ और निजी कुंजी की जगह बताएं.

एक्सटेंशन फ़ाइलें अपडेट करना

यह पेज, अपडेट किए गए पैकेज किए गए एक्सटेंशन के लिए पाथ देगा.

एक्सटेंशन फ़ाइलें अपडेट करना

कमांड लाइन के ज़रिए पैकेज

कमांड लाइन में पैकेज एक्सटेंशन जोड़ने के लिए, chrome.exe को शुरू करें. एक्सटेंशन के फ़ोल्डर की जगह बताने के लिए --pack-extension फ़्लैग का इस्तेमाल करें. साथ ही, एक्सटेंशन की निजी कुंजी वाली फ़ाइल की जगह बताने के लिए --pack-extension-key फ़्लैग का इस्तेमाल करें.

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

होस्ट

.crx फ़ाइलों को होस्ट करने वाले सर्वर को सही एचटीटीपी हेडर का इस्तेमाल करना चाहिए, ताकि उपयोगकर्ता लिंक पर क्लिक करके एक्सटेंशन इंस्टॉल कर सकें.

Google Chrome किसी फ़ाइल को इंस्टॉल करने लायक तब मानता है, जब इनमें से कोई भी बात सही होती है:

  • इस फ़ाइल का कॉन्टेंट टाइप application/x-chrome-extension है
  • फ़ाइल का सफ़िक्स .crx है और नीचे दी गई दोनों सही हैं:
    • फ़ाइल, एचटीटीपी हेडर X-Content-Type-Options: nosniff के साथ नहीं दिखाई जाती है
    • फ़ाइल को इनमें से किसी एक तरह के कॉन्टेंट के साथ दिखाया जाता है:
    • खाली स्ट्रिंग
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

इंस्टॉल की जा सकने वाली किसी फ़ाइल की पहचान न कर पाने की सबसे आम वजह यह होती है कि सर्वर, हेडर X-Content-Type-Options: nosniff भेजता है. दूसरी सबसे आम वजह यह है कि सर्वर कोई अज्ञात कॉन्टेंट टाइप भेजता है, जो पिछली सूची में नहीं था. एचटीटीपी हेडर की समस्या को ठीक करने के लिए, सर्वर का कॉन्फ़िगरेशन बदलें या .crx फ़ाइल को किसी दूसरे सर्वर पर होस्ट करें.

अपडेट करें

हर कुछ घंटों में, ब्राउज़र अपडेट यूआरएल के लिए इंस्टॉल किए गए एक्सटेंशन की जांच करता है. हर एक यूआरएल के लिए, यह अपडेट मेनिफ़ेस्ट एक्सएमएल फ़ाइल की खोज करने के लिए, उस यूआरएल से अनुरोध करता है.

  • अपडेट की जांच करने पर मिला कॉन्टेंट, अपडेट मेनिफ़ेस्ट एक्सएमएल दस्तावेज़ होता है. इसमें किसी एक्सटेंशन के सबसे नए वर्शन की जानकारी दी जाती है.

अगर अपडेट मेनिफ़ेस्ट में ऐसे वर्शन के बारे में बताया गया है जो इंस्टॉल किए गए वर्शन के बाद का है, तो ब्राउज़र नया वर्शन डाउनलोड करके इंस्टॉल करता है. मैन्युअल अपडेट की तरह, नई .crx फ़ाइल पर भी उसी निजी पासकोड से साइन किया जाना चाहिए जिससे मौजूदा वर्शन में साइन किया गया हो.

ध्यान दें: उपयोगकर्ता की निजता बनाए रखने के लिए, Google Chrome अपने-आप अपडेट होने वाले मेनिफ़ेस्ट अनुरोधों के साथ कोई भी कुकी हेडर नहीं भेजता. साथ ही, उन अनुरोधों के रिस्पॉन्स में, सेट-कुकी हेडर को भी अनदेखा करता है.

यूआरएल अपडेट करें

'Chrome वेब स्टोर' के बाहर के सर्वर पर होस्ट किए गए एक्सटेंशन में, अपनी manifest.json फ़ाइल में update_url फ़ील्ड शामिल होना चाहिए.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.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>

यह एक्सएमएल फ़ॉर्मैट, Google के अपडेट इन्फ़्रास्ट्रक्चर, Omaha में इस्तेमाल किए गए फ़ॉर्मैट से लिया गया है. एक्सटेंशन सिस्टम, अपडेट मेनिफ़ेस्ट के <app> और <updatecheck> एलिमेंट के लिए इन एट्रिब्यूट का इस्तेमाल करता है:

appid
एक्सटेंशन आईडी को सार्वजनिक कुंजी के हैश के आधार पर जनरेट किया जाता है, जैसा कि पैकेजिंग में बताया गया है. एक्सटेंशन का आईडी, एक्सटेंशन मैनेजमेंट पेज पर दिखता है.
कोड बेस
.crx फ़ाइल का एचटीटीपीएस यूआरएल.
वर्शन
क्लाइंट इसका इस्तेमाल यह तय करने के लिए करता है कि उसे codebase में बताई गई .crx फ़ाइल डाउनलोड करनी चाहिए या नहीं. यह .crx फ़ाइल की manifest.json फ़ाइल में मौजूद "वर्शन" की वैल्यू से मेल खानी चाहिए.

अपडेट मेनिफ़ेस्ट एक्सएमएल फ़ाइल में एक से ज़्यादा <app> एलिमेंट को शामिल करके, एक से ज़्यादा एक्सटेंशन के बारे में जानकारी हो सकती है.

टेस्ट करना

अपडेट की जांच की फ़्रीक्वेंसी डिफ़ॉल्ट रूप से कई घंटों की होती है, लेकिन एक्सटेंशन मैनेजमेंट पेज पर मौजूद अभी एक्सटेंशन अपडेट करें बटन का इस्तेमाल करके, अपडेट को फ़ोर्स किया जा सकता है.

अभी एक्सटेंशन अपडेट करें

इससे, इंस्टॉल किए गए सभी एक्सटेंशन की जांच शुरू हो जाएगी.

बेहतर इस्तेमाल: अनुरोध के पैरामीटर

अपने-आप अपडेट होने की बुनियादी तकनीक को इस तरह से डिज़ाइन किया गया है कि सर्वर साइड का काम आसानी से किया जा सके. जैसे, Apache जैसे किसी भी सादे वेब सर्वर पर स्टैटिक एक्सएमएल फ़ाइल को डालना और उस एक्सएमएल फ़ाइल को नए एक्सटेंशन वर्शन के तौर पर अपडेट करना.

कई एक्सटेंशन होस्ट करने वाले डेवलपर, अनुरोध के पैरामीटर की जांच कर सकते हैं. इनसे अपडेट के अनुरोध में एक्सटेंशन आईडी और वर्शन के बारे में पता चलता है. इन पैरामीटर को शामिल करने से, एक्सटेंशन को स्टैटिक एक्सएमएल फ़ाइल के बजाय, डाइनैमिक सर्वर साइड कोड चलाने वाले उसी यूआरएल से अपडेट किया जा सकता है.

अनुरोध पैरामीटर का फ़ॉर्मैट यह है:

?x=EXTENSION_DATA

जहां EXTENSION_DATA, यूआरएल के साथ कोड में बदले गए फ़ॉर्मैट की स्ट्रिंग है:

id=EXTENSION_ID&v=EXTENSION_VERSION

उदाहरण के लिए, दो एक्सटेंशन एक ही अपडेट यूआरएल (https://test.com/extension_updates.php) पर ले जाते हैं:

  • एक्सटेंशन 1
    • आईडी: "aaaaaaaaaaaaaaaaaa,aaaaaaaaa"
    • वर्शन: "1.1"
  • एक्सटेंशन 2
    • आईडी: "bbbbbbbbbbbbbbbbbbbbbbbb"
    • वर्शन: "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

हर यूनीक अपडेट यूआरएल के लिए, एक ही अनुरोध में कई एक्सटेंशन जोड़े जा सकते हैं. पिछले उदाहरण में, अगर किसी उपयोगकर्ता के पास दोनों एक्सटेंशन इंस्टॉल हैं, तो दोनों अनुरोधों को एक ही अनुरोध में मर्ज कर दिया जाता है:

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

अगर एक ही अपडेट यूआरएल का इस्तेमाल करके इंस्टॉल किए गए एक्सटेंशन की संख्या इतनी बड़ी है कि GET अनुरोध का यूआरएल बहुत बड़ा है (2,000 से ज़्यादा वर्ण का है), तो अपडेट की जांच करने पर, अतिरिक्त GET अनुरोधों की जांच करने की ज़रूरत पड़ती है.

बेहतर इस्तेमाल: ब्राउज़र का कम से कम वर्शन

एक्सटेंशन सिस्टम में ज़्यादा एपीआई जोड़े जाने पर, एक्सटेंशन का अपडेट किया गया वर्शन रिलीज़ किया जा सकता है, जो सिर्फ़ ब्राउज़र के नए वर्शन के साथ काम करेगा. हालांकि Google Chrome अपने आप अपडेट होता है, लेकिन ज़्यादातर उपयोगकर्ता आधार के किसी नई रिलीज़ में अपडेट होने में कुछ दिन लग सकते हैं. यह पक्का करने के लिए कि कोई अपडेट सिर्फ़ किसी खास वर्शन पर या उसके बाद वाले Google Chrome वर्शन पर लागू हो, अपडेट के रिस्पॉन्स में <app> एलिमेंट में "prodversionmin" एट्रिब्यूट जोड़ें.

<?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 या उसके बाद के वर्शन का इस्तेमाल कर रहे हों.