2010-09-24 35 views
0

Nous avons créé un MSI dans WiX 3.5.2030.0 et ciblant Windows Installer 4.0 (pour le support MSIUSEREALADMINDETECTION). Nous avons une propriété que nous avons défini dans le MSI pour appliquer l'utilisation d'un programme d'amorçage (je dis « faire respecter », mais il est vraiment « encourager très fortement » bien sûr):Aide pour s'assurer que le bootstrapper est utilisé mais que les mises à niveau fonctionnent

<Property Id="SETUPEXE" 
      Secure="yes" /> 
<Condition Message="You must run the MSI through the setup program; you cannot run it directly."> 
    SETUPEXE = 1 
</Condition> 

Lorsque nous courons le produit MSI comme nouvelle installation, tout fonctionne. Lorsque nous l'exécutons comme une mise à niveau, cependant, la propriété transmise à l'installateur semble être "perdue" à un moment donné. Le journal affiche les entrées pertinentes suivantes:

MSI (s) (2C:8C) [11:27:41:648]: Command Line: SETUPEXE=1 <other properties> 

MSI (s) (2C:8C) [11:27:43:055]: PROPERTY CHANGE: Adding SETUPEXE property. Its value is '1'. 

MSI (s) (2C:CC) [11:28:11:038]: PROPERTY CHANGE: Adding NETFRAMEWORK20INSTALLROOTDIR property. Its value is 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\'. 
Action ended 11:28:11: AppSearch. Return value 1. 
MSI (s) (2C:CC) [11:28:11:147]: Doing action: LaunchConditions 
Action start 11:28:11: LaunchConditions. 
MSI (s) (2C:CC) [11:28:33:662]: Product: <product> -- You must run the MSI through the setup program; you cannot run it directly. 

Action ended 11:28:33: LaunchConditions. Return value 3. 
Action ended 11:28:33: INSTALL. Return value 3. 

Property(N): SETUPEXE = 0 

Property(N): SecureCustomProperties = NETFRAMEWORK20INSTALLROOTDIR;NETFRAMEWORK35;NETFRAMEWORK35_SP_LEVEL;NEWERVERSIONDETECTED;OLDERVERSIONBEINGUPGRADED;SETUPEXE 

Property(S): SecureCustomProperties = NETFRAMEWORK20INSTALLROOTDIR;NETFRAMEWORK35;NETFRAMEWORK35_SP_LEVEL;NEWERVERSIONDETECTED;OLDERVERSIONBEINGUPGRADED;SETUPEXE 

Property(S): SETUPEXE = 1 

Je l'ai fait quelques recherches sur ce sujet et regardé le journal en WiLogUtl et ont au moins compris que Property(N) indique une propriété « imbriqué », mais je ne sais pas ce que l'imbrication est quand je cours le MSI directement par msiexec. Ensuite, je ne sais pas pourquoi la propriété imbriquée n'est pas définie correctement lorsque les valeurs client et serveur sont correctes. Comment résoudre ça?

+0

Hmmm - Je viens d'apprendre que les installations imbriquées se produisent lorsqu'une mise à niveau est en cours, ce qui est en fait ce scénario. La désinstallation de la version précédente échoue peut-être. Je pourrais avoir besoin de revoir cette question. –

Répondre

0

j'envisager de changer cette condition (ou similaire selon votre cas d'utilisation)

<Condition Message="Blah blah blah">SETUPEXE or Installed</Condition> 

je fais une chose similaire (InstallShield setup.exe passe une propriété SETUPEXEDIR par défaut) et ce n'est pas horrible chose à faire si vous voulez vous assurer que votre programme d'installation a été exécuté par le programme d'amorçage pour vous assurer que les prérequis avaient une chance d'être installés. Mais pour les scénarios de maintenance/réparation/désinstallation, vous ne voulez probablement pas exiger l'exécution de setup.exe.

+0

J'étais sur le point de poster ça quand tu m'as battu - j'ai compris ça. J'utilisais en fait REMOVE = "ALL" dans mon correctif mais Installed est probablement un choix plus sûr. –

+0

Vous voulez TOUJOURS utiliser "ou installé" dans vos conditions, sinon vous entrez dans des situations comme quelqu'un supprime .NET et maintenant vous ne pouvez pas désinstaller ou réparer votre produit. –