设置 UI 对话框并使用 WiX 有条件地安装路径
Set up the UI dialogs and install path conditionnally with WiX
我知道这是 WiX 的一个常见问题,我知道这个问题的解决方案可能很简单,但我被卡住了,none 我能找到的主题对我有帮助,所以我开始了。
我在 Visual Studio 中使用 WiX 3.11,带有一个非常简单的 UI 对话序列,该序列取自 wix documentation examples:
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> 1 </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> 1 </Publish>
</UI>
在我的目录定义中的其他地方定义了 INSTALLFOLDER。
如您所见,这非常简单:
- 欢迎
- 选择目录
- 结束安装
现在,我想修改此设置以在.msi 升级时跳过 InstallDir 对话框,并直接在现有安装文件夹中进行升级。
我在HKCU里写了一个注册表值,用来存放安装路径,安装时用属性取回。
我尝试使用条件在 UI 中创建不同的对话框序列并根据我的 属性 设置安装文件夹,但是当 运行 .msi 文件时它以错误告终。
这是现在的样子:
<Product ...Some stuff here ... >
<Property Id="ALREADYINSTALLED">
<RegistrySearch Id="InstallPath"
Key="Software$(var.MainDir)$(var.SecondaryDir)"
Name="InstallFolder"
Root="HKCU"
Type="directory"
Win64="$(var.Win64)"/>
</Property>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
/!\ Interesting part here /!\
<Publish Dialog="WelcomeDlg" Control="Next" Event="SetTargetPath" Value="[ALREADYINSTALLED]" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Component ... Some stuff here ... >
<RegistryValue Root="HKCU"
Key="Software$(var.MainDir)$(var.SecondaryDir)"
Name="InstallFolder"
Type="string"
Value="[INSTALLFOLDER]"
KeyPath="yes" />
... Some other stuff here ...
</Component>
我的条件似乎工作正常,但我无法使用 属性 传递安装文件夹。
我觉得我错过了一些简单的东西,但我不知道是什么。
有人可以帮我吗?
好吧,我最终找到了解决方案 thanks to this topic。和我想的一样,很简单。
事实证明,您可以覆盖片段定义中的目录路径,因此解决方案是:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
<!-- Overwrites the Install Folder if this is an upgrade -->
<SetDirectory Id="INSTALLFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
然后,将 UI 对话框设置为从 WelcomeDlg 到 VerifyReadyDlg:
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
你可以开始了。
我知道这是 WiX 的一个常见问题,我知道这个问题的解决方案可能很简单,但我被卡住了,none 我能找到的主题对我有帮助,所以我开始了。
我在 Visual Studio 中使用 WiX 3.11,带有一个非常简单的 UI 对话序列,该序列取自 wix documentation examples:
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> 1 </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> 1 </Publish>
</UI>
在我的目录定义中的其他地方定义了 INSTALLFOLDER。
如您所见,这非常简单:
- 欢迎
- 选择目录
- 结束安装
现在,我想修改此设置以在.msi 升级时跳过 InstallDir 对话框,并直接在现有安装文件夹中进行升级。
我在HKCU里写了一个注册表值,用来存放安装路径,安装时用属性取回。 我尝试使用条件在 UI 中创建不同的对话框序列并根据我的 属性 设置安装文件夹,但是当 运行 .msi 文件时它以错误告终。
这是现在的样子:
<Product ...Some stuff here ... >
<Property Id="ALREADYINSTALLED">
<RegistrySearch Id="InstallPath"
Key="Software$(var.MainDir)$(var.SecondaryDir)"
Name="InstallFolder"
Root="HKCU"
Type="directory"
Win64="$(var.Win64)"/>
</Property>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
/!\ Interesting part here /!\
<Publish Dialog="WelcomeDlg" Control="Next" Event="SetTargetPath" Value="[ALREADYINSTALLED]" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Component ... Some stuff here ... >
<RegistryValue Root="HKCU"
Key="Software$(var.MainDir)$(var.SecondaryDir)"
Name="InstallFolder"
Type="string"
Value="[INSTALLFOLDER]"
KeyPath="yes" />
... Some other stuff here ...
</Component>
我的条件似乎工作正常,但我无法使用 属性 传递安装文件夹。
我觉得我错过了一些简单的东西,但我不知道是什么。
有人可以帮我吗?
好吧,我最终找到了解决方案 thanks to this topic。和我想的一样,很简单。
事实证明,您可以覆盖片段定义中的目录路径,因此解决方案是:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
<!-- Overwrites the Install Folder if this is an upgrade -->
<SetDirectory Id="INSTALLFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
然后,将 UI 对话框设置为从 WelcomeDlg 到 VerifyReadyDlg:
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
你可以开始了。