سؤال

في العمل نستخدم ويكس لبناء حزم التثبيت.نريد أن يؤدي تثبيت المنتج X إلى إلغاء تثبيت الإصدار السابق من هذا المنتج على ذلك الجهاز.

لقد قرأت في عدة أماكن على الإنترنت عن ترقية رئيسية ولكن لم أتمكن من تشغيلها.هل يمكن لأي شخص تحديد الخطوات الدقيقة التي يجب علي اتخاذها لإضافة ميزة إلغاء تثبيت الإصدار السابق إلى WiX؟

هل كانت مفيدة؟

المحلول

في الإصدارات الأحدث (من الإصدار التجريبي 3.5.1315.0)، يمكنك استخدام عنصر الترقية الرئيسية بدلا من استخدام بنفسك.

على سبيل المثال، نستخدم هذا الرمز لإجراء الترقية التلقائية.فهو يمنع الرجوع إلى إصدار أقدم، مما يؤدي إلى ظهور رسالة خطأ محلية، ويمنع أيضًا ترقية إصدار مماثل موجود بالفعل (أي.تتم ترقية الإصدارات الأقل فقط):

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

نصائح أخرى

أخيرًا وجدت حلاً - أقوم بنشره هنا للأشخاص الآخرين الذين قد يواجهون نفس المشكلة (جميعكم الخمسة):

  • قم بتغيير معرف المنتج إلى *
  • تحت المنتج أضف ما يلي:

    <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) الخاص بك

فيما يلي نوع بناء الجملة الذي أستخدمه للترقيات الرئيسية:

<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>

كما أشارBrian Gillespie، هناك أماكن أخرى لجدولة RemoveExistingProducts اعتمادًا على التحسينات المطلوبة.لاحظ أن PUT-GUID-HERE يجب أن يكون متطابقًا.

سيؤدي عنصر الترقية الموجود داخل عنصر المنتج، جنبًا إلى جنب مع الجدولة المناسبة للإجراء، إلى تنفيذ عملية إلغاء التثبيت التي تريدها.تأكد من إدراج رموز الترقية لجميع المنتجات التي تريد إزالتها.

<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>

لاحظ أنه إذا كنت حذرًا بشأن إصداراتك، فيمكنك منع الأشخاص من تثبيت إصدار أقدم من منتجك عن طريق الخطأ فوق إصدار أحدث.هذا هو الغرض من الحقل الأقصى.عندما نقوم ببناء أدوات التثبيت، نقوم بتعيين UpgradeVersion Maxi على الإصدار الذي يتم إنشاؤه، ولكن IncludeMaximum="no" لمنع هذا السيناريو.

لديك خيارات فيما يتعلق بجدولة RemoveExistingProducts.أفضّل جدولته بعد InstallFinalize (بدلاً من بعد InstallInitialize كما أوصى الآخرون):

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

يؤدي هذا إلى ترك الإصدار السابق من المنتج مثبتًا حتى بعد نسخ الملفات الجديدة ومفاتيح التسجيل.يتيح لي هذا ترحيل البيانات من الإصدار القديم إلى الإصدار الجديد (على سبيل المثال، قمت بتبديل تخزين تفضيلات المستخدم من السجل إلى ملف XML، ولكنك تريد أن تكون مهذبًا وترحيل إعداداته).يتم إجراء هذا الترحيل في إجراء مخصص مؤجل قبل InstallFinalize مباشرةً.

فائدة أخرى هي الكفاءة:إذا كانت هناك ملفات لم تتغير، فلن يكلف Windows Installer عناء نسخها مرة أخرى عندما تقوم بالجدولة بعد InstallFinalize.إذا قمت بالجدولة بعد InstallInitialize، فستتم إزالة الإصدار السابق بالكامل أولاً، ثم يتم تثبيت الإصدار الجديد.وينتج عن هذا حذف غير ضروري للملفات وإعادة نسخها.

للحصول على خيارات الجدولة الأخرى، راجع موضوع التعليمات RemoveExistingProducts في MSDN.الرابط لهذا الاسبوع هو: http://msdn.microsoft.com/en-us/library/aa371197.aspx

قد يكون من الأفضل أن تسأل هذا على القائمة البريدية لمستخدمي WiX.

من الأفضل استخدام WiX مع الفهم العميق لما يفعله Windows Installer.قد تفكر في الحصول على "الدليل النهائي لمثبت Windows".

الإجراء الذي يزيل منتجًا موجودًا هو الإجراء RemoveExistingProducts.نظرًا لأن عواقب ما يفعله يعتمد على المكان الذي تمت جدولته فيه - أي ما إذا كان الفشل قد أدى إلى إعادة تثبيت المنتج القديم، وما إذا كان سيتم نسخ الملفات غير المتغيرة مرة أخرى - فيجب عليك جدولة ذلك بنفسك.

RemoveExistingProducts العمليات <Upgrade> العناصر الموجودة في التثبيت الحالي، مطابقة لـ @Id صفة إلى UpgradeCode (المحددة في <Product> element) لجميع المنتجات المثبتة على النظام.ال UpgradeCode يحدد عائلة من المنتجات ذات الصلة.أي منتجات تحتوي على رمز الترقية هذا، والتي تقع إصداراتها ضمن النطاق المحدد، وحيث UpgradeVersion/@OnlyDetect السمة هي no (أو تم حذفه)، ستتم إزالته.

الوثائق ل RemoveExistingProducts يذكر وضع UPGRADINGPRODUCTCODE ملكية.وهذا يعني أن عملية إلغاء التثبيت للمنتج الذي تتم إزالته يتلقى تلك الخاصية، التي تبلغ قيمتها Product/@Id للمنتج الذي يتم تثبيته.

إذا لم يتضمن التثبيت الأصلي الخاص بك UpgradeCode, ، فلن تتمكن من استخدام هذه الميزة.

لقد استخدمت هذا الموقع لمساعدتي في فهم الأساسيات حول ترقية WiX:

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

بعد ذلك، قمت بإنشاء نموذج مثبت (تثبيت ملف اختبار)، ثم قمت بإنشاء مثبت الترقية (تثبيت ملفين اختباريين).سيعطيك هذا فهمًا أساسيًا لكيفية عمل الآلية.

وكما قال مايك في كتاب Apress، "الدليل النهائي لمثبت Windows"، سيساعدك على الفهم، لكنه لم يتم كتابته باستخدام WiX.

موقع آخر كان مفيدًا جدًا هو هذا الموقع:

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

قرأت ال ويكس الوثائق، والأمثلة التي تم تنزيلها، ولكن لا يزال لدي الكثير من المشاكل مع الترقيات.لا تؤدي الترقيات البسيطة إلى إلغاء تثبيت المنتجات السابقة على الرغم من إمكانية تحديد عملية إلغاء التثبيت هذه.قضيت أكثر من يوم في التحقيقات ووجدت أن WiX 3.5 قدم علامة جديدة للترقيات.وهنا الاستخدام:

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

لكن ال سبب رئيسي من المشاكل هو أن الوثائق تنص على استخدام "REINSTALL=ALL REINSTALLMODE=vomus"معلمات للترقيات البسيطة والصغيرة، لكنها لا تشير إلى أن هذه المعلمات موجودة ممنوع للترقيات الرئيسية - إنهم ببساطة يتوقفون عن العمل.لذلك لا يجب استخدامها مع الترقيات الرئيسية.

أود أن أقترح إلقاء نظرة على البرنامج التعليمي لـ Alex Shevchuk.يشرح "الترقية الرئيسية" من خلال WiX بمثال عملي جيد في من MSI إلى WiX، الجزء 8 - الترقية الرئيسية.

أحد الأشياء المهمة التي فاتني من البرامج التعليمية لفترة من الوقت (مسروق من http://www.tramontana.co.hu/wix/lesson4.php) مما أدى إلى ظهور الأخطاء "تم تثبيت إصدار آخر من هذا المنتج بالفعل":

*تحديثات صغيرة يعني تغييرات صغيرة على ملف واحد أو عدد قليل من الملفات حيث لا يضمن التغيير تغيير إصدار المنتج (major.minor.build).لا يتعين عليك تغيير معرّف المنتج الفريد (GUID) أيضًا.لاحظ أنه يتعين عليك دائمًا تغيير Package GUID عند إنشاء ملف .msi جديد يختلف عن الملفات السابقة بأي شكل من الأشكال.يقوم برنامج التثبيت بتتبع البرامج المثبتة لديك ويجدها عندما يريد المستخدم تغيير التثبيت أو إزالته باستخدام هذه المعرفات الفريدة العمومية (GUIDs).سيؤدي استخدام نفس المعرف الفريد العمومي (GUID) لحزم مختلفة إلى إرباك برنامج التثبيت.

ترقيات طفيفة تشير إلى التغييرات حيث سيتغير إصدار المنتج بالفعل.قم بتعديل سمة الإصدار لعلامة المنتج.سيظل المنتج كما هو، لذا لا تحتاج إلى تغيير معرّف المنتج الفريد العمومي (GUID)، لكن بالطبع، ستحصل على معرّف الحزمة الفريد (GUID) الجديد.

ترقيات كبيرة تشير إلى تغييرات مهمة مثل الانتقال من إصدار كامل إلى آخر.يغير كل شئ:سمة الإصدار ومعرفات المنتج والحزمة.

أنا أستخدم أحدث إصدار من WiX (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) الذي قمت بتحديده في خاصية UpgradeCode الخاصة بالمنتج.

عملت أدناه بالنسبة لي.

<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>

يرجى التأكد من تطابق رمز الترقية الموجود في المنتج مع المعرف الموجود في الترقية.

هذا ما نجح معي، حتى مع التخصص تحت درجة:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top