لا يقوم MSI بتثبيت جميع الملفات عند تشغيل RemovePreviousversion

StackOverflow https://stackoverflow.com/questions/660531

سؤال

لدي بناء MSI باستخدام WIX الإصدار 3.

جميع المثبتات السابقة للمنتج الذي ننشره يعمل بشكل جيد مع التكوين المحدد (أي: إذا كان الإصدار السابق موجودًا ، فقم بإزالة ، ثم قم بتثبيت الإصدار الجديد) - ومع ذلك ، فإن MSIs الجديدة التي نبنيها لا تقوم بتثبيت جميع الملفات عند تشغيلها مسار "إزالة أولا".

إذا قمت بإزالة التثبيت الموجود يدويًا ثم قمنا بتشغيل الإصدار الجديد ، يتم تثبيت جميع الملفات - وعندما أقوم بفحص ملف MSI في ORCA ، يتم عرض الملفات والميزات ويبدو أنها جيدة.

لقد حاولنا الركض مع مطوّل وتسجيل إضافي التشغيل (/l*vx) ومع ذلك ، كل ما يمكننا معرفة ما إذا لم يتم تسجيل الملفات ثم تثبيتها.

أي أفكار أو اقتراحات؟ هذا يقودنا إلى أعلى الحائط.

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

المحلول 2

حسنًا ، تحدث جيدًا مع شخص آخر حيث ساعدتني في العثور على حل للمشكلة.

أضفنا العقار REINSTALLMODE وتعيينها على amus. ماذا يعني هذا؟

بشكل افتراضي ، تم تعيين الخاصية على omus مما يعني: إعادة التثبيت إذا كان الملف مفقودًا أو أكبر ، أعد كتابة السجل للآلة وخلايا المستخدمين ، وإعادة تثبيت اختصارات. تغيير هذا إلى amus يقول أساسا: أعد تثبيت جميع الملفات.

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

شكرا للاقتراحات.

(أيضًا ، يمكن العثور على مزيد من التفاصيل حول هذه الخاصية هنا: MSDN: خاصية RESTALLMODE

نصائح أخرى

استنادًا إلى تسلسل الإجراء المخصص الافتراضي ، يحدد Windows Installer الملفات التي يجب تثبيتها/الكتابة فوقها قبل إزالة أي إصدارات موجودة من البرامج. يستخدم Windows Installer قيمة خاصية RESTALLMODE لإخبارها بكيفية اتخاذ القرارات حول متى يتم الكتابة فوق الملفات. إذا كان إعادة التخلي عن "One" يحتوي على "O" ، فسيقوم فقط بتثبيت الملفات التي يكون فيها الإصدار مختلفًا أو أن الملف غير موجود بالفعل ؛ سيتم تثبيت الملفات غير المراسلة فقط إذا كان تاريخ تعديل الملف <= تاريخ الإنشاء (أي لم يتم تعديل الملف). إذا كان RENSTALLMODE يحتوي على "A" ، فسيقوم دائمًا بتثبيت الملف ، بغض النظر عن أي إصدار أو معلومات تاريخ متصلة بالملفات الموجودة.

ما يحدث في السيناريو على الأرجح ما يلي:

  1. يحدد تثبيت Windows الملفات التي يجب تثبيتها. يقرر أن بعض الملفات لا تحتاج إلى تثبيت (ربما لأنها موجودة بالفعل وهي من نفس الإصدارات أو أحدث الإصدارات الموجودة في MSI).
  2. تتم إزالة الإصدار السابق من البرنامج ، بما في ذلك Files Windows Installer الذي لا يلزم تثبيته.
  3. يقوم Windows Installer بتثبيت الملفات للتثبيت الجديد ، لكنه لا يقوم بتثبيت الملفات التي حددها لا تحتاج إلى تثبيت.

والنتيجة النهائية هي أن مجموعة من الملفات مفقودة بعد ترقية البرنامج. SETTERSTALLMODE = AMUS بدلاً من OMUS من المحتمل أن تقوم بإصلاح مشكلتك ، ولكن يجب عليك التأكد من أنك تعرف كيف يؤثر ذلك على بقية التثبيت. إذا كان هناك أي ملفات لا تريد الكتابة فوقها ، فستحتاج إلى وضع علامة على هذه المكونات "أبدًا الكتابة فوق".

ماذا تفعل <RemoveExistingProducts After=""> خطوة تبدو؟ قد يكون تشغيل removeExisting بعد التثبيت - وإزالة جميع الملفات التي كانت كما هي في الإصدارات السابقة والحالية.

لدي جهاز تثبيت الخاص بي <RemoveExistingProducts After="InstallInitialize"> للتأكد من أنه يتم قبل أي شيء آخر. لا أعرف ما إذا كان هذا صحيحًا أم لا ، لكن يبدو أنه يعمل.

    <Upgrade Id="$(var.UpgradeCode)">
        <!--Upgrade code found at http://www.nichesoftware.co.nz/blog/200809/upgradable-msi-installations-with-wix -->
        <!-- Detect any newer version of this product-->
        <UpgradeVersion Minimum="$(var.version)" IncludeMinimum="no" OnlyDetect="yes" Language="1033" Property="NEWPRODUCTFOUND" />

        <!-- Detect and remove any older version of this product-->
        <UpgradeVersion Maximum="$(var.version)" IncludeMaximum="yes" OnlyDetect="no" Language="1033" Property="OLDPRODUCTFOUND" />
    </Upgrade>
    <CustomAction Id="PreventDowngrading" Error="Newer version already installed"></CustomAction>
    <InstallExecuteSequence>
        <!-- Prevent Downgrading-->
        <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>
    <InstallUISequence>
        <!-- Prevent Downgrading-->
        <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
    </InstallUISequence>

أعلم أن هذا موضوع أقدم ، لكنني واجهت مشكلة مماثلة لم تتم تغطيتها بواسطة الحلول. في حالتي ، كان لدي DLL الذي كان في الواقع نسخة أقل من سابقتها. لن يظهر DLL هذا أبدًا عند تثبيت الترقية. ادارة

msiexec /i myproduct.msi /l*vx install2.log

وأظهر التحقق من السجل أن الملف لم يتم تثبيته أبدًا. لم يظهر في السجل كأحد الملفات المثبتة. احتوت MSI بالتأكيد على الملف ، وأفضل دليل على أن الإصلاح سيضع الملف. أيضًا ، أظهر انفجار MSI مع أدوات مختلفة الملف الموجود. يعمل تثبيت مستقيم على آلة نظيفة دائمًا.

هذا لم يساعد:

msiexec /i myproduct.msi REINSTALL=ALL REINSTALLMODE=amus /l*vx install3.log

أقوم ببناء MSI مع WIX ، وقد كنت أستخدم هذا البرنامج النصي لسنوات عديدة. في الآونة الأخيرة ، قمنا بتعيين البرنامج النصي لحذف الدليل القديم تمامًا في إصدار 5.3. وقد عمل هذا على 5.2 -> 5.3 و 5.3 -> 5.4 ترقيات. ولكن مع الإصدار 5.5 ، أعيد بناء جميع DLLs مع إصدارات جديدة من DLLs. تم استضافة مشاريع DLL في جيثب. تم تعيين برنامج Build Script لهذا DLL الخاص بنسخة تجميع من '10 .0.0. {git rev-list-count head} '. تم نقل المشروع ، مما تسبب في انتقال عدد الرأس من 444 إلى 30.

تشمل WixScript هذا ،

define ProductGuid = "{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}"

لذلك نقوم بتحديث GUID المنتج (وليس ترقية المنتج GUID) في كل إصدار.

كان العلاج هو تغيير البرنامج النصي البناء هذا قليلاً لضبط إصدار التجميع للانتقال إلى '10 .0.1.

لماذا نجح هذا ، أنا غير قادر على شرح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top