Vra

Ek wil 'n MSI konstrueer wat, in sy installasieproses, homself saam met sy vervatte lêers/komponente na die TargetDir sal ontplooi.

MyApp.msi bevat dus MyApp.exe en MyAppBootstrapperEmpty.exe (met geen hulpbronne) in sy lêertabel.

Die gebruiker begin 'n MyAppBootstrapperPackaged.exe (wat MyApp.msi as 'n hulpbron bevat, iewers van die internet verkry, of e-pos of andersins).MyAppBootStrapperPackaged.exe onttrek MyApp.msi na 'n temp-lêergids en voer dit uit via msiexec.exe.

Nadat die msiexec.exe-proses voltooi is, wil ek MyApp.msi, MyBootstrapperEmpty.exe hê (EN MyApp.exe in %ProgramFiles%\MyApp-lêergids sodat MyApp.exe toegang tot MyApp.msi verseker kan word wanneer dit loop (vir die skep van die onderstaande- genoemde verpakte inhoud).

MyAppBootstrapper*.exe kan probeer om MyApp.msi na %ProgramFiles%\MyApp-lêergids te kopieer, maar sal verligting nodig hê om dit te doen, en sal nie toelaat dat dit verwyder word via die Windows Installer-verwyderingproses (vanaf Voeg/Verwyder Programme of andersins), wat bewaar moet word.

Dit is duidelik dat (ek dink dit is voor die hand liggend - is ek verkeerd?) Ek kan nie die MSI as 'n lêer in my Media/CAB (hoender en eier scenario) insluit nie, so ek glo dit sal via 'n pasgemaakte aksie gedoen moet word voor die installering proses, voeg die oorspronklike MSI by die MSI DB se Media/CAB en die toepaslike inskrywing in die Lêer-tabel on the fly.Kan dit gedoen word en indien wel hoe?

Dink aan 'n inhoudverspreidingsmodel waar inhoudlêers slegs saam met die App versprei moet word.Inhoud word geproduseer deur die eindgebruiker via die toepassing tydens looptyd, en verpak in 'n verspreibare EXE wat beide die toepassing en die inhoud insluit.

MyApp se installeerder moet 'n MSI bly, maar kan deur 'n Bootstrapper EXE uitgevoer word.Die geïnstalleerde MyApp.exe moet toegang hê tot beide MyApp.msi en EXE moet tydens looptyd deur die App "saamgestel" word vanaf 'n basis (leë) MyAppBootstrapper.exe, wat ook deur die MSI geïnstalleer word, en die inhoud geskep deur die eindgebruiker.Die EXE se hulpbron-MSI moet dieselfde wees as wat gebruik word om die toepassing wat besig is om die runtime-verpakking te installeer, te installeer.

WIX moet nie met MyApp geïnstalleer word nie.

Daar kan geen netwerkafhanklikhede wees tydens loop-/verpakkingstyd nie (d.w.s.kan nie die verpakking via 'n webdiens doen nie - moet plaaslik gedoen word).

Ek is vertroud met (en gebruik) Custom Actions (bestuur en onbestuur, via DTF en andersins).

Was dit nuttig?

Oplossing

Voeg 'n ongecomprimeerde medium by jou wxs soos volg:

<Media Id='2'/>

En skep dan 'n komponent met 'n lêer-element soos hierdie:

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

Dit sal die installeerder na 'n lêer genaamd "myinstaller.msi" op die installasiemedium laat soek, in dieselfde vouer as die msi wat geïnstalleer word.Die bronpad hierbo moet na 'n dummy-lêer wys, dit is net daar om wix te paai.

Wysig:Die volgende voorbeeld test.wxs demonstreer dat dit werk.Dit produseer 'n test.msi-lêer wat homself installeer na c:\program files est.Let daarop dat jy 'n dummy test.msi-lêer in dieselfde vouer as text.wxs moet plaas om wix te paai.

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

Ander wenke

As een .MSI-pakket 'n ander .MSI-pakket van "binne" self bekendstel, word 'n genoem geneste installeer, en sy slegte juju (sien Reël 20).Windows Installer het 'n paar globale data wat dit gebruik om die huidige installasie te bestuur, en dit hanteer nie veelvuldige installasies op dieselfde tyd goed nie.Om dieselfde rede, as jy een installasie begin en dan probeer om 'n ander te begin terwyl die eerste nog aan die gang is, sal jy gewoonlik 'n pop-up sien met die effek van "nog 'n installasie aan die gang, wag asseblief totdat dit klaar is".

Jy kan 'n program hê, gewoonlik genoem 'n bootstrapper (ek dink dit is waarna jy verwys) wat self nie 'n installasiepakket is nie, maar wat bevat 'n installasiepakket (soos 'n .MSI of 'n .EXE) as 'n hulpbron, moontlik saamgepers.Die aksie van die bootstrapper-program is om die hulpbron te onttrek/uit te brei na 'n lêer, gewoonlik in 'n %TEMP% gids, begin dan óf die onttrekte .EXE óf hardloop MSIEXEC op die onttrekte .MSI.Die bootstrapper kan veelvuldige hulpbronne bevat en dit een vir een uittrek+installeer, as u voorvereistes voor die hoofpakket moet installeer.Of jy kan verskeie pakkette as afsonderlike lêers stuur, en die bootstrapper laat uitvoer/installeer hulle direk vanaf die verspreidingsmedia een vir een, of kopieer dit na die teikenmasjien en laat die reeks installeer van daar af uitvoer, of ...

WiX self word nie geïnstalleer nie, nee.Dit is 'n hulpmiddel waarmee .MSI-pakkette gebou kan word.Die WiX-projek het 'n generiese selflaaiprogram op sy wenslys, maar dit is nog nie geïmplementeer nie.Daar is ander bootstrappers beskikbaar, bv. hierdie een.

Jy sal nie 'n pasgemaakte aksie nodig hê nie - om die waarheid te sê, aangesien die bootstrapper nie self 'n Windows Installer-installasiepakket is nie, het "pasgemaakte aksie" geen betekenis daarvoor nie.En as jy vertroud genoeg is met CA's om te weet van bestuurde/onbestuurde/DTF, dan weet jy genoeg om pasgemaakte aksies te vermy wanneer jy ook al kan.(grinnik)

Ek dink dit is baie makliker vir jou bootstrapper om MSI-lêer na 'n voorafbepaalde plek te onttrek eerder as na die temp-lêergids.Byvoorbeeld, na C:\Documents and Settings\All Users\Application Data\My Company\My Product Install Cache.Nadat die installasie voltooi is, sal bootstrapper die MSI-lêer daar laat sit.As die gebruiker op 'n stadium besluit om jou produk te herinstalleer, sal Windows Installer die bron-MSI-lêer kan opspoor.

Voeg ook pad by hierdie lêer by Verwyder lêertabel sodat dit uitgevee word wanneer dit verwyder word.Jy kan gebruik Verwyder File-element in WiX daarvoor.

So as ek verstaan, dan dink ek ek sal die toepassing 'n transformasie (MST) laat skep wat die inhoudlêers het en dit op die basis-MSI toepas.Ek is nog steeds nie oortuig dat ek verstaan ​​nie.:)

Ek sal die MSI-kaspad na 'n bekende plek konfigureer.

As jy dan die MSI moet "redigeer" tydens looptyd, gebruik VBScript of soortgelyke.

Maar tog vra ek HOEKOM!?!

Ek werk ook aan 'n manier om verskeie MSI-lêers te ontplooi.Ek het 'n bootstrapper.exe-program wat die MSI-lêers bondel en hulle een op 'n slag laat loop.Dit los my probleem vir die meeste gevalle op.

Die geval wat dit nie oplos nie, is GPO (Global Policy Object) verspreiding van die installasie.GPO vereis 'n dot-msi-lêer om 'n installasie uit te voer.

Om dit te doen, is hier wat ek gedoen het wat die probleem amper opgelos het (maar nie heeltemal nie).Ek plaas die dot-msi-lêers in die lêertabel van 'n installeerder en plaas my bootstrapper in die binêre tabel en hardloop dit vanaf 'n pasgemaakte aksie wat na InstallFinalize in die InstallExecuteSequence ingevoeg is.Natuurlik sal die bootstrapper nie ander MSI's kan laat loop nie, want die MSI op die boonste vlak hou die _MSIEexecute mutex.

Dit was redelik maklik om 'n bietjie verder te kom.Ek het die bootstrapper laat beheer na die boonste vlak installeerder en gaan voort.En toe het ek 'n WaitForSingleObject-oproep bygevoeg om te wag vir die installering op die boonste vlak, en die selflaaier kan dan voortgaan om die installasie te voltooi.

My probleem is dat die GPO-installasie tydens selflaaityd plaasvind en die installering op die boonste vlak voltooi voordat die sub-installeerders klaar is en GPO die masjien herlaai.

Die topvlak-installasie gee ook 'n suksesstatus terug wanneer die installering later werklik kan misluk.

Ek is steeds op soek na 'n manier om te keer dat die installering op die boonste vlak voltooi word totdat die selflaaistrapper voltooi is.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top