سؤال

أقوم بتثبيت تطبيق كبير، وجزء منه هو أداة مكتوبة مخصصة تسمى "DBUPDATANAGER" إلى SQL SQL Scripts مقابل قاعدة بياناتنا المستهدفة.

الآن، يعمل تثبيت WIX 2.x - لكنه لديه عيب واحد: أثناء التثبيت، أقوم أيضا بتثبيت اثنين من خدمات Windows، والتي يمكن أن تبدأ اختياريا على الفور. أولئك الذين سيفشلون، إذا لم يتم تشغيل dbupdatanager بعد.

إذن ما أحاول إنجازه هو:

  1. تثبيت dbupdatemanager وخدماتي من MSI الخاص بي
  2. تشغيل dbupdatemanager. قبل أي من الخدمات تبدأ

يبدو مصدر WIX الحالي مثل هذا:

<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
  <!-- DbUpdateManager component with the necessary files -->
  <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
     <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe' 
           Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe'  KeyPath='no' />
  </Component>

  <!-- Component to install one of my Windows services -->
  <Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
     <File Id='InstallServiceFile' LongName='MyService.exe' 
           Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
     <ServiceInstall Id='InstallMyService' Name='MyService' 
                     Description='My Service' ErrorControl='normal' 
                     Start='auto' Type='ownProcess' Vital='yes' />
     <ServiceControl Id='UninstallMyService' Name='MyService' 
                     Remove='uninstall' Wait='yes' />
  </Component>

  <!-- Feature for the DbUpdateManager referencing the above component -->    
  <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR' 
           AllowAdvertise='no' Description='DbUpdateManager' Level='1' 
           Title='Database Update Manager'>
     <ComponentRef Id='DbUpdateManagerComponent'/>
  </Feature>

  <!-- Custom action for running DbUpdateManager -->    
  <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile' 
                ExeCommand='' Return='asyncWait' />

  <!-- Calling the custom action in the install sequence -->    
  <InstallExecuteSequence>
      <RemoveExistingProducts After='InstallInitialize' />
      <Custom Action='RunDbUpdateManagerAction' 
              After='InstallFinalize'>&amp;DbUpdateManager=3</Custom>

ورثت هذا WIX، ويعمل - ولكن كما قلت - يتم استدعاء DBupdatemanager بعد فوات الأوان في العملية (فقط "بعد = تثبيت التثبيت")، وبالتالي سوف تفشل الخدمات في البدء بشكل صحيح في البداية (الجري غرامة في المرة الثانية حولها عند إعادة تشغيلها يدويا بعد تشغيل dbupdatanager).

لقد قمت بضخت حول وثائق MSI قليلا ووجدت خطوة لطيفة تسمى "startservices"، لذلك كان حدتي مجرد تغيير دعوتي الإجراء المخصص إلى هذا:

   <InstallExecuteSequence>
          <Custom Action='RunDbUpdateManagerAction' 
                  Before='StartServices'>&amp;DbUpdateManager=3</Custom>

لسوء الحظ، في هذه الحالة، لا يحدث شيء على الإطلاق - dbupdatemanager أبدا يسمى ....

أي أفكار لماذا؟ تصحيح الأخطاء MSI / WIX أمر صعب حقا، ولا أستطيع أن أرى الغابة للأشجار بعد الآن ....

شكرًا! مارك

عدل ليس تظهر أثناء التثبيت :-(

تحرير 2: الآن يبدو أن الإجراءاتي قد تم تنفيذها وفي الوقت المناسب - لسوء الحظ، أنا فقط لا أرى معالجتي :-( ما أشاهده هو رمز الخطأ "قيمة الإرجاع 1631" وهذا يعني شيئا مثل "خدمة MSI" لا يمكن أن تبدأ "- WTF ؟؟

MSI (S) (2C: D8) [20: 53: 36: 383]: القيام بالعمل: rundbupdatementranageraction 20:53:36: rundbupdatemanageraction. بدأ العمل في 20:53:36: rundbupdatemanageraction. MSI (S) (2C: D8) [20: 53: 36: 383]: القيام بالعمل: Actudservices Action 20:53:36: Startservices. يتم بدء الخدمات بدأت الإجراءات في الساعة 20:53:36: Startservices. الانتهاء من العمل في 20:53:36: Rundbupdatemanageraction. قيمة العودة 1631.

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

المحلول

حاول الحصول على ملف سجل التثبيت، وابحث عن ترتيب التسلسل في هناك وقيمة الشرط لتنفيذ الإجراء المخصص

استخدم هذا في سطر الأوامر: msiexec / i [msiname] / l * v [اسم الملف

تحرير: بعد قراءة تعليقك إلقاء نظرة على هذه الصفحة هنا يمكنك محاولة إضافة غير مثبتة في الحالة

Edit2: لقد وجدت هذا صفحة ابحث عن رقم الخطأ 1631

نصائح أخرى

حسنا، حصلت أخيرا على ذلك - مع القليل من المساعدة من كل من استجاب، واستشارة بعض البرامج التعليمية في WIX ومساعدة الصفحات الموجودة على الويب. MSI Installer الاشياء ليس من السهل معرفة وتعلم ......

في الأساس، قمت بتغيير تنفيذ الإجراء المخصص الخاص بي إلى "مؤجل" (كما اقترحه ROB) وانتقلت النقطة في التسلسل حيث يتم تنفيذها إلى "بعد = InstallFiles". أنا أيضا غيرت الحالة فيu003CCustom> علامة "غير مثبتة" والتي يبدو أنها تعمل على ما يرام في سيناريو.

على عكس خوف ROP، فإن Manager DB Update Update و UI يأتي بهذه الطريقة تماما، وعملية تحديث قاعدة بياناتنا قد تم الانتهاء الآن قبل بدء تشغيل أي من خدماتنا (التي تعتمد على قاعدة البيانات).

نتطلع إلى إصدار كامل RTM من WIX 3.0 (ومستقبله)!

شكرا للجميع - لسوء الحظ، استطعت قبول إجابة واحدة فقط - كلها ستستحقها.

مارك

يبدو أن خصوصيتك تعتمد على تثبيت "DBupDatmeManagerFile". هذا يعني أن خصوصيتك يجب جدولة بعد يقوم InstallFiles بتنفيذ. تذكر أن هناك اثنين تمرير إلى installexecutesequence. أولا، يتم تنفيذ إجراءات "جيل النصوص" (أو "المجدول" (أو "المجدول") لبناء سجل المعاملات (AKA: "تثبيت البرنامج النصي"). ثانيا، يتم تنفيذ الإجراءات "المؤجلة" في سجل المعاملات.

الآن خصيصتك هو "فوري" (الافتراضي) لذلك يحاول تشغيل قبل يتم نسخ الملفات بالفعل إلى الجهاز. يعمل إجراء InstallFiles في البرنامج النصي قبل خصمك ولكن لم يتم تنفيذها بعد.

لذلك، تحتاج إلى وضع علامة على خصوصيتك "مؤجل" للحصول عليه بعد يتم تثبيت ملفاتك.

ملاحظة: ربما لم تتمكن من إظهار واجهة المستخدم من المرجع المصدق المؤجل. لم أكن متأكدة مما إذا كان من المتوقع أن تظهر هذه الأداة الخاصة بك في UI.

ملاحظة: آسف إذا لم أشرح ذلك جيدا، فقد كان يوما طويلا.

يمكنك فتح .msi في orca. وننظر إلى جدول Installexecutesequence لمعرفة الأشياء التي تحدث في الواقع. هذا قد يمنحك فكرة جيدة عن ما يحدث بالفعل عندما.

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