يمكن .msi تثبيت نفسها (ويفترض عبر إجراء مخصص)?

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

  •  01-07-2019
  •  | 
  •  

سؤال

أنا عصا لبناء MSI في عملية التثبيت, سيتم نشر نفسها جنبا إلى جنب مع الملفات المضمنة/مكونات ، TargetDir.

حتى MyApp.msi يحتوي على MyApp.exe و MyAppBootstrapperEmpty.exe (مع عدم وجود الموارد) في جدول الملفات.

المستخدم تطلق MyAppBootstrapperPackaged.exe (التي تحتوي على اسم التطبيق.msi كمورد ، التي تم الحصول عليها من شبكة الإنترنت في مكان ما, أو البريد الإلكتروني أو غير ذلك).MyAppBootStrapperPackaged.exe مقتطفات MyApp.msi إلى مجلد temp و ينفذ ذلك عن طريق msiexec.exe.

بعد msiexec.exe اكتمال عملية, أريد اسم التطبيق.msi ، MyBootstrapperEmpty.exe (و MyApp.exe في %ProgramFiles%\اسم المجلد حتى MyApp.exe يمكن ان تتأكدوا من الوصول إلى MyApp.msi عند تشغيله (على خلق المذكورة أدناه حزم المحتوى).

MyAppBootstrapper*.exe يمكن أن محاولة نسخ اسم التطبيق.msi إلى %ProgramFiles%\اسم المجلد, ولكن تحتاج الارتفاع إلى القيام بذلك ، ولن تسمح زواله عن طريق Windows Installer إلغاء عملية (من إضافة/إزالة البرامج أو خلاف ذلك) ، والتي ينبغي الحفاظ عليها.

ومن الواضح أن (أعتقد أنها واضحة - هل أنا مخطئ؟) أنا لا يمكن أن تشمل MSI كملف في وسائل الإعلام/CAB (سيناريو البيض والدجاج) ، لذلك أعتقد أنه يجب أن يتم عن طريق إجراء مخصص قبل عملية التثبيت ، مضيفا الأصلي MSI إلى MSI DB الإعلام/أجرة من المناسب إدخال في جدول الملفات على الطاير.يمكن أن يتم ذلك وإذا كان الأمر كذلك كيف ؟

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

اسم التطبيق المثبت يجب أن يبقى MSI, ولكن قد يكون أعدم من قبل على الإطلاق EXE.المثبتة MyApp.exe يجب أن يكون الوصول إلى كل اسم.msi و EXE إلى أن "المجتمعين" في وقت التشغيل عن طريق التطبيق من قاعدة (فارغة) MyAppBootstrapper.exe الذي هو أيضا تثبيت MSI و المحتويات التي تم إنشاؤها من قبل المستخدم النهائي.EXE الموارد MSI يجب أن تكون نفسها التي تستخدم لتثبيت التطبيق الذي تقوم به وقت التعبئة والتغليف.

WIX لا تكون مثبتة مع MyApp.

يمكن أن يكون هناك شبكة تبعيات في تشغيل/التعبئة والتغليف - الوقت (أيلا يمكن أن تفعل التعبئة والتغليف عن طريق Webservice - يجب أن يتم محليا).

وأنا على دراية (واستخدام) إجراءات مخصصة (المدارة وغير المدارة عبر DTF و غير ذلك).

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

المحلول

إضافة غير مضغوط متوسطة إلى وكسس مثل هذا:

<Media Id='2'/>

ثم قم بإنشاء عنصر مع ملف عنصر مثل هذا:

<File Source='/path/to/myinstaller.msi' Compressed='no' DiskId='2' />

وهذا سيجعل المثبت ابحث عن ملف يسمى "myinstaller.msi" على تركيب متوسطة ، في نفس المجلد مثل msi الذي يتم تثبيته.المصدر المسار أعلاه يجب أن نشير إلى دمية الملف, هناك فقط لاسترضاء wix.

تحرير:التالي عينة الاختبار.وكسس يدل على أن يعمل.وتنتج الاختبار.msi الذي يثبت نفسه c:\program files\الاختبار.ملاحظة أن تحتاج إلى وضع دمية اختبار.msi الملف في نفس المجلد مثل النص.وكسس لاسترضاء wix.

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product
         Name='ProductName'
         Id='*'
         Language='1033'
         Version='0.0.1'
         Manufacturer='ManufacturerName' >
      <Package
            Keywords='Installer'
            Description='Installer which installs itself'
            Manufacturer='ManufactererName'
            InstallerVersion='100'
            Languages='1033'
            Compressed='yes'
            SummaryCodepage='1252'/>

      <Media Id='1' Cabinet='test.cab' EmbedCab='yes'/> 
      <Media Id='2' /> 

      <Directory Id='TARGETDIR' Name="SourceDir">
         <Directory Id='ProgramFilesFolder'>
            <Directory Id='TestFolder' Name='Test' >
               <Component Id="InstallMyself">
                  <File Source="./test.msi" Compressed="no" DiskId="2" />
               </Component>
            </Directory>
         </Directory>
      </Directory>

      <Feature
            Id='Complete'
            Display='expand'
            Level='1'
            Title='Copy msi file to program files folder'
            Description='Test'>

         <ComponentRef Id="InstallMyself" />
      </Feature>

   </Product>
</Wix>

نصائح أخرى

وجود واحد .حزمة MSI إطلاق آخر .حزمة MSI من "داخل" نفسه يسمى متداخلة تثبيت, و هو شؤم (انظر المادة 20).Windows Installer بعض البيانات العالمية التي تستخدم لإدارة الحالي تثبيت و لا التعامل بشكل جيد التثبيت متعددة في نفس الوقت.لنفس السبب ، إذا كان يمكنك البدء في تثبيت واحد ثم محاولة بدء تشغيل آخر في حين أن الأول لا يزال في التقدم ، سوف تشاهد عادة المنبثقة تأثير "آخر تثبيت في التقدم يرجى الانتظار حتى يتم ذلك".

يمكن أن يكون لديك برنامج, وعادة ما تسمى ألف الإطلاق (أعتقد أن هذا هو ما كنت في اشارة الى) الذي هو في حد ذاته ليس تثبيت حزمة ، ولكن الذي يحتوي على تثبيت الحزمة (مثل .MSI أو .EXE) موردا ، وربما مضغوط.العمل من إطلاق البرنامج هو استخراج/تعظيم الموارد إلى ملف شيوعا في %TEMP% الدليل ، ثم إما إطلاق المستخرجة .EXE أو تشغيل MSIEXEC على استخراجها .MSI.إطلاق يمكن أن تحتوي على موارد متعددة واستخراج+تثبيت واحدا تلو الآخر, إذا كنت بحاجة إلى تثبيت المتطلبات المسبقة قبل الحزمة الرئيسية.أو يمكنك سفينة متعددة الحزم ملفات منفصلة و يكون إطلاق تنفيذ/تثبيتها مباشرة من وسائل الإعلام التوزيع واحد أو نسخ إلى الجهاز الهدف وتشغيل سلسلة من تثبيت من هناك أو...

WiX نفسه لا على تثبيت لا.انها أداة .حزم MSI يمكن أن يبنى.على WiX المشروع يحتوي على مفضلة عام إطلاق البرنامج ، ولكن لم تنفذ حتى الآن.وهناك غيرها من bootstrappers المتاحة مثل هذا واحد.

لن تحتاج إلى إجراء مخصص -- في الواقع ، منذ إطلاق ليست نفسها تثبيت Windows Installer الحزمة "إجراء مخصص" لا معنى لها.و, إذا كنت على دراية كافية مع CAs أن تعرف عن المدارة وغير المدارة/DTF, ثم كنت تعرف ما يكفي لتجنب إجراءات مخصصة كلما استطعت.(ابتسامة)

اعتقد انه من الاسهل بكثير بالنسبة الإطلاق إلى استخراج ملف MSI إلى بعض المعرفة مسبقا الموقع بدلا من المجلد temp.على سبيل المثال ، C:\Documents and Settings\All Users\Application Data\الشركة\My المنتج تثبيت ذاكرة التخزين المؤقت.بعد انتهاء التثبيت الإطلاق أن تترك MSI يجلس هناك.إذا في مرحلة ما قرر المستخدم إلى إعادة تثبيت المنتج الخاص بك Windows Installer سوف تكون قادرا على تحديد موقع مصدر MSI.

أيضا, إضافة مسار هذا الملف إلى RemoveFile الجدول بحيث يحصل حذف على إلغاء التثبيت.يمكنك استخدام RemoveFile عنصر في WiX على ذلك.

أنا أفهم, ثم أعتقد أنني قد التطبيق إنشاء تحويل (MST) الذي يحتوي على محتوى الملفات و تطبيق ذلك على قاعدة MSI.ما زلت غير مقتنع أن أفهم على الرغم من.:)

أود تكوين MSI ذاكرة التخزين المؤقت المسار إلى موقع معروف.

ثم في وقت التشغيل إذا كنت بحاجة إلى "تحرير" MSI استخدام VBScript أو ما شابه ذلك.

ولكن لا يزال, أنا أسأل لماذا!?!

وأنا أعمل أيضا على طريقة نشر عدة ملفات MSI.لدي bootstrapper.exe برنامج حزم MSI الملفات و يعمل منهم في وقت واحد.هذا يحل مشكلتي في معظم الحالات.

القضية لا حل هو كائن نهج المجموعة (السياسة العالمية كائن) توزيع تثبيت.GPO يتطلب دوت msi لتشغيل تثبيت.

للقيام بذلك هنا هو ما فعلته التي تكاد تحل المشكلة (ولكن ليس تماما).أنا وضعت نقطة msi الملفات في ملف الجدول المثبت و أضع الإطلاق في جدول ثنائي وتشغيله من إجراء مخصص إدراجها بعد InstallFinalize في InstallExecuteSequence.بالطبع الإطلاق لن تكون قادرة على تشغيل أخرى MSI لأن أعلى مستوى MSI يحمل _MSIExecute مزامنة.

كان من السهل جدا للحصول على أبعد قليلا.أنا جعلت الإطلاق إعادة التحكم إلى أعلى مستوى المثبت continute.ثم أضفت WaitForSingleObject الدعوة إلى الانتظار للحصول على أعلى مستوى تثبيت حتى النهاية ، و إطلاق مواصلة لإنهاء تثبيت.

مشكلتي هي أن GPO التثبيت يحدث في وقت التمهيد أعلى مستوى تثبيت يكمل قبل sub التركيب تتم GPO إعادة تمهيد الجهاز.

على toplevel تثبيت أيضا إرجاع النجاح الوضع عندما تثبيت قد تفشل في الواقع في وقت لاحق.

أنا لا تزال تبحث عن وسيلة لمنع أعلى مستوى تثبيت من إكمال حتى بعد إطلاق يكمل.

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