2012-04-27 9 views
9

मैंने वास्तव में मूल क्रोम एक्सटेंशन बनाया और स्वत: अद्यतन सुविधा का परीक्षण करने के लिए एक साधारण node.js सर्वर स्थापित किया। सर्वर .crx फ़ाइल होस्ट करता है, इसलिए मैं http://localhost:3000/clients/chrome/extension.crx पर जाकर बस बिना किसी परेशानी के एक्सटेंशन को इंस्टॉल कर सकता हूं। लेकिन जब मैं tools ->extensions पर जाता हूं और Update extensions now पर क्लिक करता हूं, तो एक्सटेंशन नए संस्करण को नहीं लाता है। सर्वर को localhost:3000/clients/chrome/updates.xml के लिए अनुरोध प्राप्त होता है, लेकिन नई extension.crx फ़ाइल के लिए कोई अनुरोध प्राप्त नहीं होता है। मुझसे यहां क्या गलत हो रहा है?मेरा क्रोम एक्सटेंशन स्वयं ऑटो-अपडेट क्यों नहीं कर रहा है?

$ पेड़

. 
|-- clients 
| `-- chrome 
|  |-- extension 
|  | `-- manifest.json 
|  |-- extension.crx 
|  |-- extension.pem 
|  `-- updates.xml 
`-- web.js 

विस्तार वास्तव में है सिर्फ एक मैनिफ़ेस्ट फ़ाइल:


कोड

मुझे सिर्फ कोड में आपका मार्गदर्शन इस reproductible बनाने के लिए करते हैं ।

manifest.json

{ 
    "name": "testing auto-updates", 
    "version": "1.0", 
    "update_url": "http://localhost:3000/clients/chrome/updates.xml" 
} 

आप देख सकते हैं, मैं एक update_url की चर्चा करते हुए कर रहा हूँ स्वत: अपडेट संभव बनाने के लिए।

updates.xml

<?xml version='1.0' encoding='UTF-8'?> 
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'> 
    <app appid='fkphbmkcjefhhnnlhhjlnkellidponel'> 
    <updatecheck codebase='http://localhost:3000/clients/chrome/extension.crx' version='1.0' /> 
    </app> 
</gupdate> 

विस्तार पैकेजिंग extension.crx और extension.pem पैदा करता है।

मैं भी फ़ाइलों की सेवा के लिए एक सरल Node.js सर्वर बनाया:

web.js

var express = require('express'); 

var app = express.createServer(express.logger()); 

/* ROUTES */ 

app.get('/clients/chrome/extension.crx', function(request, response) 
{ 
    response.contentType('application/x-chrome-extension'); 
    response.sendfile('clients/chrome/extension.crx'); 
}); 

app.get('/clients/chrome/updates.xml', function(request, response) 
{ 
    response.sendfile('clients/chrome/updates.xml'); 
}); 

/* ROUTES END */ 

var port = process.env.PORT || 3000; 

app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 

ठीक है, चलो इस परीक्षण करते हैं। सबसे पहले, सर्वर प्रारंभ:

$ नोड web.js

Listening on 3000 

http://localhost:3000/clients/chrome/extension.crx जाकर एक्सटेंशन इंस्टॉल करें। यह हिस्सा पहली कोशिश पर पूरी तरह से काम करता है। सर्वर अनुरोध लॉग:

127.0.0.1 - - [Thu, 26 Apr 2012 22:25:47 GMT] "GET /clients/chrome/extension.crx HTTP/1.1" 304 - "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/11.10 Chromium/18.0.1025.151 Chrome/18.0.1025.151 Safari/535.19" 

के विस्तार को संशोधित करते हैं:

  1. manifest.json में, 1.1 (1.0 की intead) को version निर्धारित किया है।
  2. updates.xml में, version से 1.1 (1.0 के बजाय) सेट करें।
  3. उसी समय extention.pem फ़ाइल का उपयोग करके एक्सटेंशन को पुन: पैक करें।
  4. नई extension.crx फ़ाइल बनाई गई है।>Extensions - - Tools पर
  5. क्लिक करें>Extensions ->Update extensions now

एक Tools में 1.1 करने के लिए एक्सटेंशन के संस्करण संख्या परिवर्तन देखने की उम्मीद करेंगे।

इसके बजाए, कुछ भी नहीं होता है। सर्वर को updates.xml के लिए अनुरोध प्राप्त है लेकिन extension.crx के लिए नहीं।

उत्तर

2

मुझे लगता है कि त्रुटि यह है कि आपकी वेब.जेएस फ़ाइल updates.xml पर कैसे कार्य करती है। यहां मेरा तर्क है:

  • मैंने आपके सेटअप को डुप्लिकेट किया और अपडेट की कमी देखी।
  • फिर मैंने अपना दूसरा ड्रॉपबॉक्स फ़ोल्डर का उपयोग करके दूसरा परीक्षण किया, और सब कुछ पूरी तरह से चला गया।
  • अंत में, मैंने दो और परीक्षण किए: एक नोड-होस्टेड updates.xml एक ड्रॉपबॉक्स-होस्टेड फ़ाइल को इंगित करता है, और दूसरा ड्रॉपबॉक्स-होस्टेड updates.xml नोड-होस्टेड क्रैक्स फ़ाइल को इंगित करता है।

परिणाम है कि जब भी updates.xml नोड द्वारा परोसा गया था, क्रोम सही ढंग से विस्तार को अद्यतन नहीं किया गया था, और जब updates.xml ड्रॉपबॉक्स, सब कुछ जब ठीक है, जो की परवाह किए बिना crx फ़ाइल की मेजबानी द्वारा आयोजित किया गया। (और मैंने मैनिफेस्ट में update_url को बदल दिया और प्रत्येक परीक्षण के लिए एक्सटेंशन को पुनर्निर्मित/अपलोड किया)।

वास्तव में ऐसा क्यों होता है अभी भी मेरे लिए एक बहुत बड़ा रहस्य है। यहाँ HTTP प्रतिसाद शीर्षलेख मैं जब मैं क्रोम में updates.xml लाने हैं (सामान्य रूप से, पता बार का उपयोग, मैं अपडेट करें कार्रवाई से वास्तविक शुद्ध यातायात सूँघने नहीं कर रहा हूँ, बस इसे अनुकरण):

ड्रॉपबॉक्स:

HTTP/1.1 200 OK 
Server: nginx/1.0.14 
Date: ... 
Content-Type: application/xml 
Transfer-Encoding: chunked 
Connection: keep-alive 
x-robots-tag: noindex,nofollow 
etag: ... 
pragma: public 
cache-control: max-age=0 
Content-Encoding: gzip 

Node.js:

HTTP/1.1 200 OK 
X-Powered-By: Express 
Content-Type: application/xml 
Date: ... 
Cache-Control: public, max-age=0 
Last-Modified: ... 
ETag: "..." 
Accept-Ranges: bytes 
Content-Length: 284 
Connection: keep-alive 

मैं भी सोचा था कि यह बंदरगाहों के साथ एक समस्या हो सकती है (शायद क्रोम गैर 80 पो से अद्यतन करने के लिए पसंद नहीं है आरटीएस?), और अब मैंने अभी पाया है कि updates.xml पर सेवा कर रहा है और पोर्ट 80 पर अपने अपाचे सर्वर से सीआरएक्स फ़ाइल नोड के साथ देखी गई समस्या के समान टूटने का कारण बनती है।

मेरी इच्छा है कि मेरे पास आपके लिए एक वास्तविक जवाब हो, लेकिन हो सकता है कि आप ड्रॉपबॉक्स के साथ कुछ परीक्षण चला सकें और आखिर में पता लगाएं कि वे अलग-अलग क्या कर रहे हैं जो क्रोम को उनकी अपडेट फ़ाइल की तरह बनाता है।

+0

कम से कम ड्रॉपबॉक्स के साथ मेरी सफलता एक अनियंत्रित क्रोम-लागू एचटीटीपीएस की संभावना से बाहर है आवश्यकता, जो मेरे पिछले अनुमानों में से एक था, क्योंकि ड्रॉपबॉक्स ने HTTP और HTTPS पर समान रूप से अच्छी तरह से काम किया था। – apsillers

+0

यह अजीब चीज है: मैं इसे विभिन्न शीर्षकों के साथ करने की कोशिश कर रहा था और देखता हूं कि इससे क्या फर्क पड़ता है, लेकिन फिर यह बात बिना किसी संशोधन के पहले प्रयास पर काम करती है ... अगर मुझे पता चल जाए तो मैं वापस पोस्ट करूंगा मैं पहले प्रयास में खराब हो गया .. – Shawn

+0

मेरा एकमात्र अन्य सिद्धांत यह है कि 1.1 सीआरएक्स फ़ाइल को मूल 1.0 फ़ाइल से कुछ अलग करने की आवश्यकता है? यही एकमात्र चीज है जिसके बारे में मैं सोच सकता हूं कि मैंने जांच नहीं की और शायद मेरे परीक्षणों में अलग-अलग किया हो। – apsillers

1

चूंकि यह आपका एक्सएमएल प्राप्त करता है और एक्सटेंशन को अपडेट नहीं करता है, तो यह संभवतः आपके अपडेट xml में कुछ पसंद नहीं करता है। मेरा सबसे अच्छा अनुमान यह है कि आपका 'एपिड' स्थापित एक्सटेंशन की ऐप आईडी से मेल नहीं खाता है। पृष्ठ क्रोम पर: // एक्सटेंशन इंस्टॉल किए गए एक्सटेंशन की 'आईडी' देखते हैं और सत्यापित करते हैं कि वह मान अपडेट करता है जो update.xml

+0

दरअसल समस्या मुझे कुछ भी बदलने के बिना चली गई है (जो मुझे पता है)। दूसरे शब्दों में, मैंने इसे हल किया लेकिन मुझे नहीं पता कि कैसे। आप सिद्धांत स्पष्ट रूप से सही अर्थ बनाते हैं, लेकिन मुझे एपिड बदलने की याद नहीं है इसलिए मैं पुष्टि नहीं कर सकता ... – Shawn

संबंधित मुद्दे