2017-06-15 5 views
0

J'ai deux modes de travail dans mon installateur:Comment puis-je remplacer conditionnellement fichier lors de l'installation Wix?

  1. utilisent des fichiers de configuration à gauche de l'installation précédente
  2. supprimer tous les configs et mis configs par défaut à la place

existantes Le mode est déterminé par la case à cocher dans l'interface utilisateur WPF de l'installateur. Si le deuxième mode est sélectionné, puis CustomAction est exécuté, qui supprime le dossier configs à partir du disque manuellement:

<InstallExecuteSequence> 
    <Custom Action="RemoveConfigsFolder" After="RemoveFolders" Overridable="yes">NOT Installed AND DELETESETTINGS=1</Custom>  
</InstallExecuteSequence> 

J'utilise l'attribut NeverOverwrite:

<ComponentGroup Id="Configs" Directory="INSTALLDIR" > 
    <Component Id="Configs" Permanent="yes" NeverOverwrite="yes"> 
    <File Id="main.config" Name="main.config" Source=".\Configs\main.config" KeyPath="yes" /> 
    </Component> 
</ComponentGroup> 

Le premier mode fonctionne très bien dans ce cas, mais lorsque je tente d'utiliser second mode, il échoue et toutes les configs sont tout simplement supprimés et jamais créé à nouveau lors de l'installation.

Au cours de mes recherches sur la question, je pense que j'ai trouvé la raison pour laquelle cela se produit: https://community.flexerasoftware.com/showthread.php?96157-The-truth-the-whole-truth-about-quot-Never-overwrite-quot-and-quot-Permanent-quot-files&p=156826#post156826

En fait, cela est un problème Windows Installer. Si vous vous connectez la désinstallation vous remarquerez que très tôt dans l'installation le programme d'installation décide que le composant contenant ce fichier ne sera pas installé car il est marqué "Ne jamais écraser" et une copie de ce fichier déjà existe sur la cible machine. La désinstallation se passe après ce qui supprime le fichier existant. En effet, le programme d'installation décide ce lorsque l'action « CostFinalize » est lancé. Cette action doit être exécuté avant que l'action « de RemoveFiles ».

Mais comment puis-je résoudre ce problème?

+0

S'agit-il d'une mise à niveau majeure et, si oui, où est-elle programmée? – PhilDW

Répondre

0

Ma première pensée est de supprimer la propriété 'Never Overwrite'. Créez ensuite une condition de composant qui vérifie si le fichier existe. Ma pensée est que votre action personnalisée a la condition de supprimer correctement les fichiers de configuration. Si les fichiers n'existent pas, les composants seront sélectionnés pour l'installation.

3

Le problème avec les paramètres tels que Ne jamais écraser ou permanent est qu'ils ressemblent à des paramètres de construction, mais ils ne sont pas vraiment - ils collent au système attaché à l'ID du composant. La réinitialisation du projet n'aidera pas car elle est associée à cet identifiant. On ne sait pas non plus pourquoi la configuration de Never Overwrite est peut-être une solution à certains problèmes, car par définition les correctifs et les surclassements ne l'écraseront pas, mais l'écraser est une exigence de votre configuration.

Même si vous n'avez pas défini Ne jamais écraser les règles Windows Installer, le fichier ne sera pas écrasé s'il a été modifié après l'installation. Donc, si vous l'aviez installé, alors il a été modifié, et ensuite vous avez fait une mise à jour, le fichier ne serait pas écrasé (ce qui est une autre raison pour laquelle Never Overwrite ne semble pas nécessaire). Un autre problème est que votre action personnalisée RemoveConfigsFolder n'est pas marquée avec une valeur d'énumération Execute, par conséquent elle est immédiate, par conséquent elle ne s'exécute pas, donc elle peut simplement échouer, donc sans voir le code, il est impossible de dire si signale un problème s'il ne peut pas effectuer la suppression. Il n'est également pas possible de déterminer s'il spécifie correctement le chemin d'accès complet au dossier.Le correctif le plus probable est donc de marquer l'action personnalisée en tant qu'exécution différée et la valeur DELETESETTINGS doit être transmise via CustomActionData.

+0

Le problème est, je ne suis pas toujours * mise à niveau *. Parfois, il désinstalle et installe par la suite. Pour autant que je sache, les règles Windows Installer fonctionnent différemment dans ce cas, et elles écraseront le fichier même s'il a été modifié après l'installation. C'est la situation où je dois utiliser Never Overwrite. – GaGar1n