2009-04-17 14 views
12

मैं पीईक्यूटी के आधार पर एक क्रॉस प्लेटफॉर्म एप्लिकेशन बनाए रखता हूं जो लिनक्स मैक और विंडोज़ पर चलता है।स्वयं अपडेटिंग py2exe/py2app एप्लिकेशन

विंडोज़ और मैक संस्करणों को py2exe और py2app का उपयोग करके वितरित किया जाता है, जो काफी बड़े बंडल (~ 40 एमबी) उत्पन्न करता है।

मैं डाउनलोड आकार को सीमित करने के लिए एक "ऑटो अपडेट" कार्यक्षमता, पैच के आधार पर जोड़ना चाहते हैं:

  • एक http सर्वर पर नए संस्करणों के लिए जाँच
  • पैच पिछले करने के लिए अद्यतन करने के लिए आवश्यक डाउनलोड संस्करण
  • पैच सूची लागू करते हैं और अनुप्रयोग फिर से आरंभ

मैं कुछ सवाल हैं:

  • विंडोज़ एप्लिकेशन को अपडेट करने का पसंदीदा तरीका क्या है क्योंकि खुली फाइलें लॉक हैं और ओवरराइट नहीं की जा सकती हैं?
  • मैं पैच तैयार और लागू कैसे करूं? शायद bsdiff/pspatch का उपयोग कर रहे हैं? (मेरे ऐप के दो py2exe संस्करणों ~ 75 MB असम्पीडित पर एक diff:

[अद्यतन]

मैं bsdiff साथ पैच बनाने के लिए एक सरल वर्ग है, जो बहुत ही कुशल के रूप में अपनी साइट पर विज्ञापित है बनाया) एक 44 केबी पैच पैदा करता है! मेरे लिए काफी छोटा, मैं इस प्रारूप में रहूंगा।

कोड pyflu के 'अद्यतन' पैकेज में उपलब्ध है, जो पायथन कोड की एक छोटी लाइब्रेरी है।

+0

ब्याज से आप कई संस्करणों/अपडेटों के साथ अद्यतनों से निपटने की योजना कैसे बनाते हैं। जैसे उपयोगकर्ता के पास 1.0 है, फिर जब तक वे इसे चलाने का प्रयास करते हैं तो वहां 10 अपडेट होते हैं? क्या आप मांग पर पैच उत्पन्न करेंगे? कैशिंग के साथ मुझे लगता है कि यह बहुत बुरा नहीं होगा, लेकिन मान लें कि आपके पास कुछ सर्वर-साइड कोड उपलब्ध है ... –

+1

यदि उपयोगकर्ता 10 अपडेट चूक गया तो अद्यतनकर्ता नवीनतम संस्करण तक पहुंचने के लिए आवश्यक 10 पैच डाउनलोड करेगा और उन्हें लागू करेगा एक - एक करके। कोई सर्वर साइड कोड नहीं है, केवल एक सरल अपाचे सर्वर निर्देशिका सामग्री दिखा रहा है। –

उत्तर

4

मुझे विश्वास नहीं है कि py2exe पैच किए गए अपडेट का समर्थन करता है।हालांकि, अगर आप एक भी EXE (py2exe website example - पृष्ठ के निचले भाग) में पूरे पैकेज बंडल नहीं है, आप दूर छोटे अद्यतन के साथ बस कुछ फ़ाइलों, EXE फ़ाइल की तरह, उदाहरण के लिए की जगह मिल सकती है। यह आपके अपडेट के आकार को काफी कम कर सकता है।

आप एक अलग अद्यतनकर्ता ऐप लिख सकते हैं, जिसे आपके एप्लिकेशन के अंदर से डाउनलोड/चलाया जा सकता है। यह ऐप प्रत्येक अपडेट के लिए अलग हो सकता है, क्योंकि फ़ाइलों को अपडेट करने की आवश्यकता है।

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

+0

शुद्ध जिज्ञासा से, एक अजगर निष्पादन योग्य, या उस मामले के लिए कोई अन्य निष्पादन योग्य बाइनरी पैचिंग का समर्थन नहीं करेगा? एक नया बाइनरी पैच सिर्फ NewVersion.exe minus OldVersion.exe नहीं है, पैच को NewVersion.exe बनाने के लिए आवश्यक बाइट्स को बदलने के साथ? – ryeguy

3

मुझे पैच के बारे में पता नहीं है, लेकिन ओएस एक्स पर कोको ऐप्स के साथ "मानक" Sparkle है। असल में यह "एपकास्टिंग" करता है। यह हर बार पूर्ण ऐप डाउनलोड करता है। प्रेरणा के लिए इसे देखकर लायक हो सकता है।

मैं ओएस एक्स पर कल्पना करता हूं कि आप शायद अपने ऐप बंडल का वास्तविक हिस्सा डाउनलोड कर सकते हैं जिसमें आपका विशिष्ट कोड (libs आदि नहीं है जो पैक किया जाता है) और यह बंडल में प्रतिस्थापित करने के लिए काफी छोटा और आसान होगा ।

विंडोज़ पर, आप शायद अपने ऐप को एक एक्सई में बंडल करके एक समान चाल नहीं कर पाएंगे - इस प्रकार आप वास्तव में एक फ़ाइल को बदल सकते हैं जो वास्तव में बदल गया है।

मुझे लगता है कि आपका वास्तविक पायथन कोड 40 एमबी से बहुत कम होगा, इसलिए शायद यह जाने का तरीका है।

चल रहे ऐप को बदलने के लिए, सबसे पहले आपको इसे स्थान ढूंढना होगा, इसलिए आप एक शुरुआती बिंदु प्राप्त करने के लिए sys.executable का उपयोग कर सकते हैं, तो आप शायद बच्चे की प्रक्रिया को फोर्क कर सकते हैं, माता-पिता की प्रक्रिया को मार सकते हैं और बच्चे को वास्तविक प्रतिस्थापन कर रहे हैं?

मैं वर्तमान में एक छोटे से wxPython ऐप के साथ खेल रहा हूं और वास्तव में इस समस्या के बारे में सोच रहा हूं। मुझे यह सुनना अच्छा लगेगा कि आप किस चीज के साथ आते हैं।

इसके अलावा संपीड़ित होने पर आप कितना बड़ा ऐप करते हैं? अगर यह अच्छी तरह से संपीड़ित हो तो शायद आप पूरी चीज भेज सकते हैं।

+1

ऐप 40 एमबी * संपीड़ित है * :) यह सभी डीएलएल और पायथन रनटाइम है जो इसका सबसे अधिक हिस्सा लेता है, मेरा कोड केवल 500 केबी है। –

1

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

+0

कभी-कभी आप डीएलएल को अपडेट करना चाहते हैं (उदाहरण के लिए क्यूटी संस्करण बदलते समय, नए एक्सटेंशन मॉड्यूल निर्भरता इत्यादि जोड़ना ...), मैं मैन्युअल रूप से जांचना नहीं चाहता हूं अगर हर बार जब मैं रिलीज करता हूं तो सबकुछ काम करता है। –

2

यह अब 4 साल पुराना है, लेकिन Esky के बारे में क्या?

0

एक पुरानी पोस्ट, लेकिन मैंने सोचा कि मैं pyinstaller के साथ pyupdater का उल्लेख करेंगे।

यह अमेज़ॅन और एसपीपी का समर्थन करता है।

भविष्य में, हाल ही में GitHub पदों के अनुसार, वे मुक्त विकल्प का समर्थन करना चाहते हैं।

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