Wix में मेजर अपग्रेड करने से Add/Remove Programs में 2 प्रविष्टियाँ बनती हैं




windows-installer major-upgrade (2)

मेजर अपग्रेड - "द ओल्ड, मैनुअल वे"

मुझे लगता है कि आप एक विषमता को मार रहे हैं, जो कि auto-generated product GUID संयोजन द्वारा वाईएक्स मेजरअपग्रेड तत्व द्वारा पूरी तरह से नियंत्रित नहीं किया जा सकता है, AllowSameVersionUpgrades को yes और version number को समान रखने के लिए सेट किया गया है।

मुझे वाईएक्सएक्स के मेजरग्रेडग्रेड तत्व में न्यूनतम समावेशी विशेषता को स्थापित करने का कोई स्पष्ट तरीका नहीं दिखाई दे रहा है - मुझसे गलती हो सकती है, एक ऐसा तरीका हो सकता है जिससे मैं अनजान हूं। इसके लायक क्या है, मैं "समान संस्करण उन्नयन" की अनुमति देने के लिए उत्सुक नहीं हूं।

हालाँकि, आप "पुराने तत्वों" को Upgrade करने के लिए " पुराने तरीके " का उपयोग करने की कोशिश कर सकते हैं। मेजरअपग्रेड तत्व अनिवार्य रूप से आपके प्रमुख उन्नयन को आसानी से स्थापित करने के लिए एक "सुविधा" सुविधा है, और मेरा मानना ​​है कि यह अधिकांश उपयोगकर्ताओं के लिए काम करता है। बॉब अर्नसन का एक ब्लॉग है जो मेजरअपग्रेड तत्व की शुरुआत को समझाता है । यह ब्लॉग "पुराने तत्वों" के साथ "मैन्युअल रूप से" चीजों को कैसे करना है, इसका एक नमूना दिखाता है Upgrade और UpgradeVersion (चेक आउट करें)।

मैंने एक त्वरित मॉक-अप किया, जो आप चाहते हैं वह कर सकता है, यह सिर्फ एक "मोटा मसौदा" है - कोई गारंटी नहीं दे सकता है। मैं कुछ वैरिएबल सेट करने के लिए प्रीप्रोसेसर डिफाइनरों का उपयोग करता हूं जिन्हें वाईएक्स स्रोत फ़ाइल में संदर्भित किया जा सकता है - सी ++ डेवलपर के रूप में यह आपके लिए केक का एक टुकड़ा है इसलिए मैं इसे समझाने में समय बर्बाद नहीं करूंगा - स्रोत को समझ में आना चाहिए:

<?define MyProductVersion = "31.00.0000" ?>
<?define MyProductCode = "PUT-GUID-HERE" ?>
<?define MyUpgradeCode = "PUT-GUID-HERE" ?>

<!--Recommendation: set a path variable that you can redirect at will to a new release folder (new build output folder): -->

<!-- <?define MyBasePath = "C:\Projects\MyApp\Release\31.00.0000\" ?> -->

  <!-- SAMPLE: 
   <Component Win64="yes" Feature="MainApplication">
     <File Source="$(var.MyBasePath)\myapp.exe" />
   </Component> -->

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Id="$(var.MyProductCode)" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
           Name="Bla" UpgradeCode="$(var.MyUpgradeCode)" Version="$(var.MyProductVersion)">

    <Package Comments="Contact: Refael Sheinker, [email protected]" Description="Bla"
             InstallerVersion="500"
             Compressed="yes"
             InstallScope="perMachine"
             Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />

    <Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />

   <!-- Major upgrade -->
    <Upgrade Id="$(var.MyUpgradeCode)">
      <!-- Downgrade Protection -->
      <UpgradeVersion Minimum="$(var.MyProductVersion)" OnlyDetect="yes" IncludeMinimum="yes" Property="DOWNGRADE_DETECTED"  />
      <!-- Major Upgrade Configuration -->
      <UpgradeVersion IncludeMinimum="no" Maximum="$(var.MyProductVersion)" IncludeMaximum="no" MigrateFeatures="yes" Property="UPGRADE_DETECTED"   />
    </Upgrade>

    <!-- Major Upgrade: Schedule RemoveExistingProducts -->
    <InstallExecuteSequence>
      <!-- Potential scheduling (after): InstallValidate, InstallInitialize, InstallExecute, InstallExecuteAgain, InstallFinalize -->
      <RemoveExistingProducts After="InstallInitialize" /> 
    </InstallExecuteSequence>

    <!--Launch Condition: Abort setup if higher version found-->
    <Condition Message="!(loc.NewerVersionDetected)">
      NOT DOWNGRADE_DETECTED
    </Condition>

    <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
    <UIRef Id="WixUI_InstallDir" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFiles64Folder">
        <Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
          <Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="APPLICATIONROOTDIRECTORY">

      <Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
        <CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
        <IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
        <IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
      </Component>
   </DirectoryRef>

    <Feature Id="MainApplication" Title="TenLira" Level="1">
      <!--<ComponentRef Id="tenlira.ini" />-->
    </Feature>

  </Product>

</Wix>

अब !(loc.NewerVersionDetected) को स्पष्ट करना होगा। यह एक स्थानीयकृत स्ट्रिंग है (विभिन्न भाषाओं में अपना सेटअप देने के लिए)। इसका उपयोग करने के लिए, विज़ुअल स्टूडियो में अपनी वाईएक्स परियोजना पर राइट क्लिक करें और जाएं: Add New Item... => Localization File => Add । जैसा कि स्थानीयकरण फ़ाइल को जोड़ा जाता है, आपका आउटपुट MSI अब आपके मुख्य आउटपुट स्थान (डीबग या रिलीज़) के तहत एक en-us फ़ोल्डर में भी जाएगा।

स्थानीयकरण फ़ाइल में, जोड़ें:

<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
    <String Id="NewerVersionDetected">A later version of [ProductName] is already installed.</String>
</WixLocalization>

और अब आपको इस फ़ाइल में नए तार जोड़ने में सक्षम होना चाहिए और ऐसी भाषा फ़ाइलों का उपयोग करके आसानी से अपने पूरे सेटअप का अनुवाद करना चाहिए।

वाईएक्स जीयूआई एक्सटेंशन भी जोड़ें। Right click "References". Add Reference... => Browse to WixUIExtension.dll => Double click this file, and press OK Right click "References". Add Reference... => Browse to WixUIExtension.dll => Double click this file, and press OK । फ़ाइल खोजने के लिए सामान्य फ़ोल्डर है: C:\Program Files (x86)\WiX Toolset v3.11\bin

INI-फ़ाइलें

मैं केवल यह उल्लेख करना चाहता हूं कि INI फाइलें आदर्श रूप से IniFile टेबल के माध्यम से स्थापित की जानी चाहिए (प्रविष्टियों को परमाणु कुंजी-मूल्य जोड़े के रूप में माना जाता है जो मौजूदा INI फ़ाइलों के लिए कुंजी और मान के उन्नत विलय की अनुमति देता है), और फ़ाइल तालिका के माध्यम से नहीं (फ़ाइल का इलाज किया जाता है एक नियमित फ़ाइल के रूप में या तो पूरी मौजूदा फ़ाइल को अधिलेखित करना या इसे जगह में छोड़ देना - किसी भी नए मूल्यों को लागू नहीं करना)। MSI IniFile तालिका से संबंधित WiX तत्व स्वाभाविक रूप से IniFile तत्व है

एक तदर्थ नमूना:

<Component Id="Test.ini" Guid="PUT-GUID-HERE" Win64="yes" Feature="MainApplication">
    <CreateFolder Directory="APPLICATIONROOTDIRECTORY" />
    <IniFile Id="SomeSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting1" Name="Test.ini" Section="MySection" Value="Some Setting" />
    <IniFile Id="OtherSetting" Action="addLine" Directory="APPLICATIONROOTDIRECTORY" Key="Setting2" Name="Test.ini" Section="MySection" Value="Other Setting" />
</Component>

मैंने आधिकारिक मेजर अपग्रेड गाइड का पालन किया है और मुझे कुछ याद आ रहा है। यहाँ मेरा MCVE :

<?xml version="1.0" encoding="UTF-8"?>

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product Id="*" Codepage="1252" Language="1033" Manufacturer="Bla Corporation"
           Name="Bla" UpgradeCode="PUT-GUID-HERE" Version="31.00.0000">

    <Package Comments="Contact: Refael Sheinker, [email protected]" Description="Bla"
             InstallerVersion="500"
             Compressed="yes"
             InstallScope="perMachine"
             Keywords="Installer,MSI,Database" Languages="1033" Manufacturer="Bla Corporation" Platform="x64" />

    <Media Id="1" Cabinet="my_application.cab" EmbedCab="yes" />

    <MajorUpgrade AllowDowngrades="no"
                  AllowSameVersionUpgrades="no"
                  Disallow="no"
                  IgnoreRemoveFailure="no"
                  MigrateFeatures="yes"
                  Schedule="afterInstallInitialize"
                  DowngradeErrorMessage="A later version of [ProductName] is already installed" />

    <Property Id="WIXUI_INSTALLDIR" Value="APPLICATIONROOTDIRECTORY" />
    <UIRef Id="WixUI_InstallDir" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFiles64Folder">
        <Directory Id="PROGRAMFILESSUBDIR" Name="Bla">
          <Directory Id="APPLICATIONROOTDIRECTORY" Name="BlaInternal" />
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="APPLICATIONROOTDIRECTORY">

      <Component Id="tenlira.ini" Guid="*">
        <File Id="tenlira.ini" Source="..\ConfigurationFile\x64\tenlira.ini" KeyPath="yes" />
      </Component>

    </DirectoryRef>

    <Feature Id="MainApplication" Title="TenLira" Level="1">
      <ComponentRef Id="tenlira.ini" />
    </Feature>

  </Product>

</Wix>

यह सब बस एक फ़ाइल को एक उदाहरण के रूप में स्थापित कर रहा है। अब तक सब ठीक है। अब, मैं केवल एक और Component और File जोड़ रहा हूँ और पाठ्यक्रम में इसी ComponentRef को जोड़ रहा हूँ। मैं विशेष रूप से Version को छोड़ता हूं: 31.00.0000। मुझे उम्मीद थी कि नया इंस्टॉलर एक मेजर अपग्रेड नहीं करेगा, लेकिन यह करता है। क्यूं कर? साथ ही, Add / Remove Programs में अब 2 प्रविष्टियाँ हैं।

कृपया मुझे यह पता लगाने में मदद करें कि मैं यहां क्या याद कर रहा हूं। धन्यवाद। Refael।

अद्यतन करें : प्रश्न पोस्ट करने से मुझे फिर से दस्तावेज़ को फिर से पढ़ने के लिए मिला और मुझे पता चला कि MajorUpgrade तत्व में AllowSameVersionUpgrades thingy को yes सेट किया जाना चाहिए। इस बार Add / Remove Programs में केवल एक ही एंट्री है, लेकिन यह अभी भी मेजर अपग्रेड करता है। क्यूं कर?


यह एक प्रमुख अपग्रेड करता है क्योंकि दोनों MSI में एक ही UpgradCode है और आपने अब AllowSameVersionUpgrades को निर्दिष्ट कर दिया है, इसलिए यह अपग्रेड करता है जहां यह पहले नहीं था।

आपका निर्माण हर बार एक नया ProductCode उत्पन्न करता है, इसलिए प्रत्येक MSI एक नया उत्पाद है, इसलिए आप इसे दो बार स्थापित करेंगे यदि यह एक अपग्रेड नहीं करता है और एक बार यदि यह करता है। आपके द्वारा अपग्रेड किए गए तरीके को अपग्रेड करने के तरीके के बारे में आपकी कुछ धारणा हो सकती है।