वाईएक्स इंस्टॉलर अपग्रेड कैसे लागू करें?


233

काम पर हम स्थापना संकुल के निर्माण के लिए वाईएक्स का उपयोग करते हैं। हम चाहते हैं कि उत्पाद X की स्थापना से उस मशीन के पिछले संस्करण की स्थापना रद्द हो जाए।

मैंने एक प्रमुख अपग्रेड के बारे में इंटरनेट पर कई जगहों पर पढ़ा है लेकिन यह काम नहीं कर सका। क्या कोई कृपया सटीक चरणों को निर्दिष्ट कर सकता है जो मुझे वाईएक्सएक्स में पिछले संस्करण सुविधा की स्थापना रद्द करने के लिए लेने की आवश्यकता है?

जवाबों:


189

नवीनतम संस्करणों में (3.5.1315.0 बीटा से), आप अपने स्वयं के उपयोग के बजाय मेजरअपग्रेड तत्व का उपयोग कर सकते हैं।

उदाहरण के लिए, हम इस कोड का उपयोग स्वचालित उन्नयन करने के लिए करते हैं। यह डाउनग्रेड करने से रोकता है, स्थानीयकृत त्रुटि संदेश देता है, और पहले से मौजूद समान संस्करण को अपग्रेड करने से भी रोकता है (अर्थात केवल निचले संस्करण उन्नत हैं):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

8
इसके बारे में बॉब अर्नसन का ब्लॉग पोस्ट बहुत सारी अच्छी जानकारी प्रदान करता है।
डेव एंडरसन

17
नोट: कहीं भी दर्ज नहीं किया है, लेकिन " <MajorUpgrade>तत्व" रखा जाना चाहिए के बाद <Package> । अन्यथा, candleनिम्न त्रुटि देता है: "त्रुटि CNDL0107: स्कीमा सत्यापन पंक्ति 1, स्तंभ 473 में निम्न त्रुटि के साथ विफल हुआ: तत्व 'उत्पाद' नामस्थान में ' schemas.microsoft.com/wix/2006/wi ' अमान्य बाल तत्व है ' प्रमुख नामों में ' योजना ' schemas.microsoft.com/wix/2006/wi '। संभावित तत्वों की सूची:' पैकेज '। "
रॉब डब्ल्यू

21
+1 इस उत्तर के लिए अधिक से अधिक उत्तोलन प्राप्त करने की आवश्यकता है; यह बहुत ही आकर्षक है कि एक उत्तर के साथ जाना है जिसमें 5x अपवोट हैं, लेकिन पुराने दृष्टिकोण का उपयोग करता है।
लिन Crumbling 16

1
अच्छी बात। मैंने एक उदाहरण जोड़ा है ताकि लोग इसे अनदेखा न करें क्योंकि यह एक नहीं है!
Ant

6
केवल यह बताना चाहते हैं कि आपको निर्दिष्ट करने की आवश्यकता नहीं है AllowDowngradesया नहीं AllowSameVersionUpgrades। वे पहले से ही नहीं के लिए डिफ़ॉल्ट।
चमकदार

221

अंत में मुझे एक समाधान मिला - मैं इसे अन्य लोगों के लिए यहाँ पोस्ट कर रहा हूँ जिन्हें समान समस्या हो सकती है (आप सभी 5):

  • उत्पाद ID को * में बदलें
  • उत्पाद जोड़ने के तहत निम्नलिखित:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
  • InstallExecuteSequence ऐड के तहत:

    <RemoveExistingProducts Before="InstallInitialize" /> 

अब से जब भी मैं उत्पाद स्थापित करता हूं तो वह पिछले स्थापित संस्करणों को हटा देता है।

नोट: अपग्रेड आईडी को अपने स्वयं के GUID से बदलें


153
हां, वाईएक्स सीखना अस्पष्ट आवृतियों का पता लगाने की कोशिश करना है जो किसी ने एक सरल कार्रवाई करने के लिए 'समझदारी' का फैसला किया है। UNIX की तरह।
एमएमआर

6
इसके अलावा, वास्तव में "उत्पाद ID को * में बदलें" क्या करता है? क्या यह हर बार एक नया उत्पाद आईडी बनाता है? क्या आपके उत्पाद के परिणाम किसी निश्चित आईडी से अधिक नहीं हैं? - यह ओवरकिल की तरह लगता है।
एंथनी

10
@Antony, @ डोर हेल्पर: मुझे पूरा यकीन है कि यहां नया GUID बनाने के लिए आपको "*" का उपयोग नहीं करना चाहिए। GUID अंदर (अपग्रेड Id = "") हार्ड-कोडेड और फिक्स्ड होना चाहिए, और यह GUID आपके (उत्पाद अपग्रेडकोड ​​= "") विशेषता से मेल खाना चाहिए।
जोनाथन हार्टले

37
मुझे लगता है कि आपको वास्तविक जीयूआईडी नहीं होने के लिए संभवतः अपना उदाहरण संपादित करना चाहिए। मुझे यकीन है कि लोग कॉपी-पेस्ट करेंगे और इसका इस्तेमाल वर्बेटिम करेंगे। हो सकता है कि "Your-PRODUCT'S-UPGRADECODE-GUID-HERE" का उपयोग करें?
ब्राउन

12
आपके उदाहरण में बग है। MSI ProductVersionकेवल तीन संस्करण फ़ील्ड का समर्थन करता है; इसलिए चौथे क्षेत्र की तुलना बिल्कुल नहीं की जाएगी। VersionMin और VersionMax के तहत टिप्पणी में देखें msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
श्रीधर Ratnakumar

89

निम्नलिखित प्रमुख उन्नयन के लिए मैं उपयोग किए जाने वाले वाक्यविन्यास का प्रकार है:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

@ ब्रायन गिलेस्पी ने उल्लेख किया कि वांछित अनुकूलन के आधार पर RemoveExistingProducts को शेड्यूल करने के लिए अन्य स्थान हैं। ध्यान दें कि पाइट-गाइड-समान होना चाहिए।


2
मैं यहाँ Wix पर निक रामिरेज़ की किताब में "अपग्रेडिंग एंड पैचिंग" सेक्शन पढ़ रहा हूँ, और वह कहता है कि यदि आप InstallInitialize के बाद RemoveExistingProducts को शेड्यूल करते हैं, तो आपको भी शेड्यूल करना होगा <InstallExecute After="RemoveExistingProducts" />। आपके उदाहरण में यह नहीं है - इसका मतलब यह है कि पुस्तक गलत है?
विम कॉइनन

3
मैंने कभी भी InstallExecute को स्पष्ट रूप से शेड्यूल नहीं किया है।
रोब मेन्चिंग

1
मैं नही। वाईएक्स वी 3.6 में, बर्न को मामूली अपग्रेड करना आसान होगा लेकिन बर्न के बिना इसे उपयोगकर्ता से मैन्युअल इंटरैक्शन (कमांड-लाइन विकल्प प्रदान करना होगा) जो कि माइनर अपग्रेड्स को मूल रूप से बेकार बनाता है। :)
रोब मेनिंग

1
@RobMensching: आप नए संस्करण पर पुराने संस्करण की स्थापना से कैसे बचेंगे? आपका जवाब मेरे लिए काम करता है (केवल "प्रमुख अपग्रेड" उदाहरण है जिसे मैं वाईएक्स v3.5.2519.0 के साथ बिल्कुल संकलन कर सकता हूं), लेकिन एक पुराने संस्करण को स्थापित करना संभव है (इसके बाद, मैं दोनों संस्करणों को "ऐड / /" में देखता हूं) कार्यक्रम निकालें ")।
क्रिश्चियन स्पीच

4
ठीक है, मुझे अभी इस उत्तर में मेजरअपग्रेड तत्व मिला है जो डाउनग्रेड को रोकने सहित वास्तव में मुझे क्या चाहिए।
क्रिश्चियन स्पैच

40

उत्पाद तत्व के अंदर अपग्रेड तत्व, क्रिया के उचित शेड्यूलिंग के साथ संयुक्त रूप से आपके द्वारा अनइंस्टॉल करने के बाद होगा। उन सभी उत्पादों के उन्नयन कोड सूचीबद्ध करना सुनिश्चित करें जिन्हें आप हटाना चाहते हैं।

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

ध्यान दें, यदि आप अपने बिल्ड से सावधान हैं, तो आप लोगों को गलती से अपने उत्पाद के पुराने संस्करण को नए सिरे से स्थापित करने से रोक सकते हैं। यही अधिकतम क्षेत्र के लिए है। जब हम इंस्टॉलरों का निर्माण करते हैं, तो हम इस संस्करण को बनाए जाने वाले संस्करण के लिए अपग्रेड वर्जन सेट करते हैं, लेकिन इस परिदृश्य को रोकने के लिए शामिल करें = "नहीं"।

आपके पास RemoveExistingProducts के शेड्यूलिंग के बारे में विकल्प हैं। मैं इसे InstallFinalize (बजाय InstallInitialize के बाद दूसरों की सिफारिश की है) के बाद समयबद्धन पसंद करते हैं:

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

यह नई फ़ाइलों और रजिस्ट्री कुंजियों की प्रतिलिपि बनाए जाने तक उत्पाद के पिछले संस्करण को छोड़ देता है। यह मुझे पुराने संस्करण से नए में डेटा स्थानांतरित करने की अनुमति देता है (उदाहरण के लिए, आपने रजिस्ट्री से उपयोगकर्ता वरीयताओं के भंडारण को एक XML फ़ाइल में बदल दिया है, लेकिन आप विनम्र होना चाहते हैं और उनकी सेटिंग्स को स्थानांतरित करना चाहते हैं)। यह माइग्रेशन InstallFinalize से ठीक पहले आस्थगित कस्टम क्रिया में किया जाता है।

एक अन्य लाभ दक्षता है: यदि अपरिवर्तित फाइलें हैं, तो जब आप InstallFinalize के बाद शेड्यूल करते हैं तो Windows इंस्टालर उन्हें फिर से कॉपी करने से परेशान नहीं करता है। यदि आप InstallInitialize के बाद शेड्यूल करते हैं, तो पिछला संस्करण पूरी तरह से पहले हटा दिया जाता है, और फिर नया संस्करण स्थापित किया जाता है। इससे फ़ाइलों का अनावश्यक विलोपन और पुनरावृत्ति होती है।

अन्य शेड्यूलिंग विकल्पों के लिए, MSDN में RemoveExistingProducts मदद विषय देखें। इस सप्ताह, लिंक है: http://msdn.microsoft.com/en-us/library/aa371197.aspx


2
@ ब्रायन गिलेस्पी: "अपरिवर्तित फाइलें हैं ..." का क्या मतलब है? किसी फ़ाइल, असेंबली वर्जन, असेंबली फ़ाइलविज़न, फ़ाइल साइज़, को बदलने के लिए विंडोज इंस्टालर के मानदंड क्या हैं?
नॉट्टीलिया

2
@donttellya +1 ने इसे कठिन तरीका सीखा। RemoveExistingProductsके बाद निर्धारित किया गया था InstallFinalizeऔर dlls को अद्यतन नहीं किया जा रहा था क्योंकि असेंबली को अपरिवर्तित किया गया था, लेकिन असेंबलीप्रोडक्ट जैसे अन्य फ़ील्ड थे। मुझे नहीं फ़ाइल तुलना दिनचर्या की दया पर होना चाहता हूँ - मैं सिर्फ चाहते पिछले एप्लिकेशन चला गया
वाल

16

बेहतर हो सकता है कि आप वाईएक्स-यूजर्स की मेलिंग सूची पर यह पूछें ।

Windows इंस्टालर क्या कर रहा है, इसकी समझ के साथ वाईएक्स का सबसे अच्छा उपयोग किया जाता है। आप " विंडोज इंस्टालर के लिए निश्चित गाइड " प्राप्त करने पर विचार कर सकते हैं ।

मौजूदा उत्पाद को हटाने वाली क्रिया RemoveExistingProducts क्रिया है । क्योंकि यह क्या करता है इसके परिणाम पर निर्भर करता है कि यह कहाँ निर्धारित है - अर्थात्, चाहे विफलता के कारण पुराने उत्पाद को फिर से स्थापित किया जाए, और क्या अपरिवर्तित फ़ाइलों को फिर से कॉपी किया जाता है - आपको इसे स्वयं शेड्यूल करना होगा।

RemoveExistingProducts<Upgrade>मौजूदा इंस्टॉलेशन में तत्वों को प्रोसेस करता है, सिस्टम पर सभी इंस्टॉल किए गए उत्पादों की @Idविशेषता UpgradeCode( <Product>तत्व में निर्दिष्ट ) से मेल खाता है। UpgradeCodeसे संबंधित उत्पादों के एक परिवार को परिभाषित करता है। जिन भी उत्पादों में यह अपग्रेडकोड ​​है, जिनके संस्करण निर्दिष्ट सीमा में आते हैं, और जहां UpgradeVersion/@OnlyDetectविशेषता है no(या छोड़ा गया है), हटा दिया जाएगा।

संपत्ति RemoveExistingProductsसेट करने वाले उल्लेखों के लिए प्रलेखन UPGRADINGPRODUCTCODE। इसका मतलब यह है कि हटाए जा रहे उत्पाद के लिए स्थापना रद्द प्रक्रिया उस संपत्ति को प्राप्त करती है, जिसका मूल्य Product/@Idउस उत्पाद के स्थापित होने के लिए है।

यदि आपकी मूल स्थापना में a शामिल नहीं है UpgradeCode, तो आप इस सुविधा का उपयोग नहीं कर पाएंगे।


21
कोई संदेह नहीं है कि माइक को पता है कि वह किस बारे में बात कर रहा है, सभी सम्मान के साथ, लेकिन यह मुझे निराशा का सामना करने के लिए उकसाता है कि मैं अपने दिमाग को अव्यवस्थित रूप से समझ सकता हूं कि विंडोज इंस्टालर क्या कर रहा है। इससे पहले कि मैं यह जानता हूं, मैं ई-कॉमर्स परामर्श केंद्रों के गॉडफुल टेक सेंटर कस्बों में, रिंग-रोड से बाहर, मेरी टीपीएस रिपोर्ट भर रहा हूं और सोच रहा हूं कि जीवन इतना खाली क्यों लगता है। मुझे लगता है कि मेरी अगली परियोजना NSIS के साथ स्थापित हो सकती है, जो अपने सभी दोषों के लिए, एक पूर्व-असेंबली जैसी भाषा की तरह, यह मुझे समझ नहीं आया कि विंडोज इंस्टालर क्या कर रहा है।
जोनाथन हार्टले 12

2
@ टार्टले - इनोसेटअप के साथ जाएं, जो आपको असेंबली जैसी भाषा बचाएगा :) सुनिश्चित करें कि आप IStool भी हड़प लें, यह बहुत मदद करता है। इसके अलावा - सहमति है कि सरल इंस्टॉल के लिए यह सब बहुत जटिल है, लेकिन मुझे लगता है कि उन्हें वास्तव में SQL Server 2008 जैसे कुछ स्थापित करने के लिए इस जटिलता की आवश्यकता है ...
रोमन स्टार्कोव

11

मैंने इस साइट का उपयोग वाईएक्स अपग्रेड के बारे में मूल बातें समझने में मदद करने के लिए किया है:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

बाद में मैंने एक नमूना इंस्टॉलर बनाया, (एक परीक्षण फ़ाइल स्थापित), फिर अपग्रेड इंस्टॉलर (2 नमूना परीक्षण फ़ाइलें स्थापित) बनाया। यह आपको एक बुनियादी समझ देगा कि तंत्र कैसे काम करता है।

और जैसा कि माइक ने एप्रेस की पुस्तक "द डेफिनिटिव गाइड टू विंडोज इंस्टॉलर" में कहा, यह आपको समझने में मदद करेगा, लेकिन यह वाईएक्स का उपयोग करके नहीं लिखा गया है।

एक और साइट जो बहुत मददगार थी वह थी:

http://www.wixwiki.com/index.php?title=Main_Page


पृष्ठ पर उदाहरण अपेक्षित wix.tramontana.co.hu/tutorial/upgrades-and-modularization/… के रूप में काम नहीं करता है । मैंने इसके साथ खेला। यह तब भी डाउनग्रेड करना संभव है जब पेज बताता है कि यह निषिद्ध होगा
सर्गटेक

10

मैंने वाईएक्स प्रलेखन को पढ़ा , उदाहरणों को डाउनलोड किया, लेकिन मुझे अभी भी अपग्रेड के साथ बहुत सारी समस्याएं थीं। माइनर अपग्रेड पिछले उत्पादों के अनइंस्टॉल को निष्पादित करने की संभावना के बावजूद उन अनइंस्टॉल को निर्दिष्ट करने के लिए निष्पादित नहीं करता है। मैंने जांच के लिए एक दिन और बिताया और पाया कि वाईएक्स 3.5 ने उन्नयन के लिए एक नया टैग तैयार किया है। यहाँ उपयोग है:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

लेकिन समस्याओं का मुख्य कारण यह था कि प्रलेखन मामूली और छोटे उन्नयन के लिए " REINSTALL = ALL REINSTALLMODE = vomus " मापदंडों का उपयोग करने के लिए कहता है , लेकिन यह नहीं कहता कि वे पैरामीटर प्रमुख उन्नयन के लिए FORBIDDEN हैं - बस काम करना बंद कर दें। तो आप उन्हें प्रमुख उन्नयन के साथ उपयोग नहीं करना चाहिए।


7

मेरा सुझाव है कि एलेक्स शेवचुक के ट्यूटोरियल पर एक नज़र डालें। वह वाईएक्स के माध्यम से "प्रमुख अपग्रेड" बताते हैं, उदाहरण के लिए एमएसआई से वाईएक्स, भाग 8 - मेजर अपग्रेड पर


उस लेख के लिंक के लिए धन्यवाद ... यह शानदार है!
राबर्ट पी

7

एक महत्वपूर्ण चीज जो मैंने कुछ समय के लिए ट्यूटोरियल से मिस कर दी ( http://www.tramontana.co.hu/wix/lesson4.pp से चुराई गई) हुई) जिसके परिणामस्वरूप "इस उत्पाद का एक और संस्करण पहले से इंस्टॉल है" त्रुटियां:

* छोटे अद्यतनों का अर्थ है एक या कुछ फ़ाइलों में छोटे परिवर्तन जहाँ परिवर्तन उत्पाद संस्करण (मेजर। मिनर.बिल्ड) को बदलने का वारंट नहीं करता है। आपको उत्पाद GUID को या तो बदलना नहीं है। ध्यान दें कि आपको हमेशा एक नई .msi फ़ाइल बनाते समय पैकेज GUID को बदलना होगा जो किसी भी संबंध में पिछले वाले से अलग है। इंस्टॉलर आपके इंस्टॉल किए गए प्रोग्रामों का ट्रैक रखता है और उन्हें तब ढूंढता है जब उपयोगकर्ता इन GUID का उपयोग करके इंस्टॉलेशन को बदलना या निकालना चाहता है। विभिन्न पैकेजों के लिए एक ही GUID का उपयोग करना इंस्टॉलर को भ्रमित करेगा।

माइनर अपग्रेड उन परिवर्तनों को दर्शाता है जहां उत्पाद संस्करण पहले से ही बदल जाएगा। उत्पाद टैग के संस्करण विशेषता को संशोधित करें। उत्पाद समान रहेगा, इसलिए आपको उत्पाद GUID को बदलने की आवश्यकता नहीं है, लेकिन निश्चित रूप से, एक नया पैकेज GUID प्राप्त करें।

प्रमुख उन्नयन एक पूर्ण संस्करण से दूसरे में जाने जैसे महत्वपूर्ण परिवर्तनों को दर्शाता है। सब कुछ बदलें: संस्करण विशेषता, उत्पाद और पैकेज गाइड।


3
पैकेज: Id प्रकार: AutogenGuid विवरण: उत्पाद या मर्ज मॉड्यूल के लिए पैकेज कोड GUID। किसी उत्पाद का संकलन करते समय, इस विशेषता को प्रत्येक बिल्ड के लिए पैकेज कोड को उत्पन्न करने की अनुमति देने के लिए सेट नहीं किया जाना चाहिए। मर्ज मॉड्यूल को संकलित करते समय, इस विशेषता को मॉडर्लाइज़ेशन गाइड पर सेट किया जाना चाहिए। ---- तो हम पैकेज आईडी पर ध्यान देने की जरूरत नहीं है, है ना?
कूपर.उउ

आपका लिंक मृत है
bam500

5

मैं वाईएक्स (3.0) के नवीनतम संस्करण का उपयोग कर रहा हूं और उपरोक्त काम नहीं कर सका। लेकिन इसने काम किया:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

ध्यान दें कि PUT-GUID-HERE, GUID के समान होना चाहिए जिसे आपने उत्पाद के UpgradCode गुण में परिभाषित किया है।


2

नीचे मेरे लिए काम किया।

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

कृपया सुनिश्चित करें कि उत्पाद में UpgradCode Id अपग्रेड में मिलान कर रहा है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.