如何防止 Wix 在安装时覆盖目录
How to prevent Wix from overwriting directories on install
我有一个 Windows 应用程序,它有 2 个版本,有点不同,但每个版本的名称不同。我使用相同的 .wxs 来构建,因为我没有理由创建第二个 wix 项目。我不想争论这是否是个好主意。
问题是:每个版本都必须安装在
path \ mainDir \ versionDir
其中 path \ mainDir 对于每个版本都是相同的。
我的问题是 mainDir 在安装时被每个版本完全覆盖。
假设我安装了 version1,我会有
path \ mainDir \ version1Dir
然后如果我安装版本 2,而不是
path \ mainDir \ version1Dir
path \ mainDir \ version2Dir
我要
path \ mainDir \ version2Dir
我一直在尝试使用 Wix - how to prevent overwrite entire directory? 解决这个问题,但它只适用于文件,因为无法将条件分配给目录(或者我可能还没有找到如何这样做,我不知道不知道)。
我的目标是让每个版本都能够安装在自己的目录中,如果 mainDir 不存在则创建它,但只有在它为空时才将其删除。
这是代码,任何线索都将不胜感激。
<!-- This is in Product, I'm just pasting it here -->
<Property Id="ALREADYINSTALLED">
<RegistrySearch Id="InstallPath" Key="Software$(var.MainDir)" Name="MainFolder" Root="HKCU" Type="directory" />
</Property>
<Property Id="SECONDALREADYINSTALLED">
<RegistrySearch Id="SecondInstallPath" Key="Software$(var.MainDir)$(var.SecondDir)" Name="SecondFolder" Root="HKCU" Type="directory" />
</Property>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WINDOWSVOLUME">
<Directory Id="INSTALLFOLDER" Name=".">
<Directory Id="MAINFOLDER" Name="$(var.MainDir)">
<!-- Allows the removal of this directory on uninstall -->
<Component Id="mainFolderRemoval">
<RegistryValue Root="HKCU" Key="Software$(var.MainDir)" Name="MainFolder" Type="string" KeyPath="yes" />
<RemoveFolder Id="removal" On="uninstall" Property="ALREADYINSTALLED"/>
</Component>
<Directory Id="SECONDFOLDER" Name="$(var.SecondDir)">
<Component Id="secondFolderRemoval">
<RegistryValue Root="HKCU" Key="Software$(var.MainDir)$(var.SecondDir)" Name="SecondFolder" Type="string" KeyPath="yes" />
<util:RemoveFolderEx On="uninstall" Property="SECONDALREADYINSTALLED"/>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
<!-- Overwrites the main folder if already installed -->
<SetDirectory Id="MAINFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
所以我最终找到了它不起作用的原因。
您必须确保每个版本的产品升级代码都不同,这实际上很明显。
有人可能会争辩说我应该删除这个 post,但我相信它可能发生在任何人身上,这是一个太愚蠢的问题,不能让人们浪费时间处理这个问题。我将以这个问题为例,希望它对将来的人有用。
我有一个 Windows 应用程序,它有 2 个版本,有点不同,但每个版本的名称不同。我使用相同的 .wxs 来构建,因为我没有理由创建第二个 wix 项目。我不想争论这是否是个好主意。
问题是:每个版本都必须安装在
path \ mainDir \ versionDir
其中 path \ mainDir 对于每个版本都是相同的。 我的问题是 mainDir 在安装时被每个版本完全覆盖。 假设我安装了 version1,我会有
path \ mainDir \ version1Dir
然后如果我安装版本 2,而不是
path \ mainDir \ version1Dir
path \ mainDir \ version2Dir
我要
path \ mainDir \ version2Dir
我一直在尝试使用 Wix - how to prevent overwrite entire directory? 解决这个问题,但它只适用于文件,因为无法将条件分配给目录(或者我可能还没有找到如何这样做,我不知道不知道)。
我的目标是让每个版本都能够安装在自己的目录中,如果 mainDir 不存在则创建它,但只有在它为空时才将其删除。
这是代码,任何线索都将不胜感激。
<!-- This is in Product, I'm just pasting it here -->
<Property Id="ALREADYINSTALLED">
<RegistrySearch Id="InstallPath" Key="Software$(var.MainDir)" Name="MainFolder" Root="HKCU" Type="directory" />
</Property>
<Property Id="SECONDALREADYINSTALLED">
<RegistrySearch Id="SecondInstallPath" Key="Software$(var.MainDir)$(var.SecondDir)" Name="SecondFolder" Root="HKCU" Type="directory" />
</Property>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WINDOWSVOLUME">
<Directory Id="INSTALLFOLDER" Name=".">
<Directory Id="MAINFOLDER" Name="$(var.MainDir)">
<!-- Allows the removal of this directory on uninstall -->
<Component Id="mainFolderRemoval">
<RegistryValue Root="HKCU" Key="Software$(var.MainDir)" Name="MainFolder" Type="string" KeyPath="yes" />
<RemoveFolder Id="removal" On="uninstall" Property="ALREADYINSTALLED"/>
</Component>
<Directory Id="SECONDFOLDER" Name="$(var.SecondDir)">
<Component Id="secondFolderRemoval">
<RegistryValue Root="HKCU" Key="Software$(var.MainDir)$(var.SecondDir)" Name="SecondFolder" Type="string" KeyPath="yes" />
<util:RemoveFolderEx On="uninstall" Property="SECONDALREADYINSTALLED"/>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" />
<!-- Overwrites the main folder if already installed -->
<SetDirectory Id="MAINFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
所以我最终找到了它不起作用的原因。 您必须确保每个版本的产品升级代码都不同,这实际上很明显。
有人可能会争辩说我应该删除这个 post,但我相信它可能发生在任何人身上,这是一个太愚蠢的问题,不能让人们浪费时间处理这个问题。我将以这个问题为例,希望它对将来的人有用。