WIX UI 适用于多个目标目录

3

我需要用户能够为我的安装设置多个不同的目标目录。

我有这个目录结构:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="DCOMPANY" Name="MyCompany" >
      <Directory Id="DMAIN" Name="MainDir">
        <Directory Id="DPART1" Name="Part1"/>
        <Directory Id="DPART2" Name="Part2"/>
      </Directory>
    </Directory>
  </Directory>
</Directory>

我这里还有一些属性:

我也有这些属性

<Property Id="WIXUI_INSTALLPATH" Hidden="yes" /> 
<Property Id="VARIABLE_PATH_DPART1" Value="DPART1" />
<Property Id="VARIABLE_PATH_DPART2" Value="DPART2" />

为了覆盖Single InstallDirDialog,我复制了WIXUI_InstallDir.wxs和InstallDirDlg.wxs文件。我复制了InstallDirDlg.wxs并在文件末尾添加了数字1和2,并将所有三个文件的前缀改为custom_,并相应地更改了它们的UI标签:
现在,在custom_WIXUI_InstallDir.wxs中,我更改了这个块,所以我期望我的属性由操作设置:
  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="custom_InstallDirDlg1">LicenseAccepted = "1"</Publish>


  <Publish Dialog="custom_InstallDirDlg1" Control="Back" Event="NewDialog"
  Value="LicenseAgreementDlg">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next"    
  Event="SetTargetPath" Value="[VARIABLE_PATH_DPART1]" Order="1">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="DoAction"
  Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="SpawnDialog"
  Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND
  WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="DoAction"
  Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND
  WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="Next" Event="NewDialog"
  Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR
  WIXUI_INSTALLDIR_VALID="1"</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="ChangeFolder"
  Property="_BrowseProperty" Value="[VARIABLE_PATH_DPART1]"
  Order="1">1</Publish>
  <Publish Dialog="custom_InstallDirDlg1" Control="ChangeFolder"
  Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>

  <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog"
  Value="custom_InstallDirDlg1" Order="1">NOT Installed</Publish>

在custom_InstallDirDlg1.wxs中,我也将此行更改为我的路径变量:
    <Control Id="Folder" Type="PathEdit" X="20" Y="100" Width="320"
  Height="18" Property="VARIABLE_PATH_DPART1" Indirect="yes" />

当我现在编译时,所有的东西都被创建了,当我运行安装程序时,当我点击“更改…”按钮或“下一步…”按钮时,安装程序会冻结大约30秒钟,然后显示“指定的路径DPART1不可用。”
当我查看所有那些CDATA块中调用的自定义操作的源代码时,我发现它们只关心WIXUI_INSTALLPATH,并且不接受任何给它们的东西。所以这基本上是使用间接寻址来实现的。
我也在某个地方读到过,这个对话框可以被重用,让用户输入多个目标路径,但我想不出怎么做。
请帮忙 :)

我现在没有时间详细阅读这篇文章,但请看一下这个答案:WiX-installer With Configurable Feature Directory(在中间位置,如果相关的话也可以看看答案的其余部分)。 - Stein Åsmul
非常感谢,这对我帮助很大。可惜我之前一直在寻找“多个自定义目标目录”之类的关键词,所以没有找到它。如果您愿意,我可以给您悬赏:D 事实上,我现在甚至无法为您在那篇文章中链接的答案投赞成票,因为我的声望不够了:D - Ravior
现在不用担心赏金,如果有帮助,请尝试提供那些信息。我没有进行过多的测试 - 请测试并告诉我们你发现了什么。顺便说一下,那个对话框来自WiX Mondo对话框集 - 但我假设你已经解决了所有这些问题?我在这里描述了使用Mondo对话框集设置最小化WiX编译的方法 - Stein Åsmul
是的,我已经按照您使用功能来区分软件部分的想法解决了问题;这样每个部分都可以安装到不同的目录中。我还确保没有这些“功能”可以被禁用,通过将它们的“缺失”标志设置为false,并将相应的组件设置为location="local",以便用户无法选择“从网络安装”选项。 - Ravior
好的,非常好。请务必检查使用此方法时在不同的安装模式下会发生什么(安装、修复、修改、自我修复、打补丁等)。属性通常不会被MSI自动持久化,但功能目录可能会 - 不幸的是我还没有足够的使用经验来确定。还要注意,它们可能可以在命令行上设置并因此被覆盖。我应该明天测试一下。如果我完成了,我会让你知道的。 - Stein Åsmul
你是否将属性持久化到注册表并在主要升级时读取它们?看起来目录属性在大多数安装模式下都被持久化了,但在主要升级时没有。这可能会在升级后给你带来很多烦恼(你将回到默认文件夹)。我稍微更新一下我的答案。 - Stein Åsmul
1个回答

2
也许我会将其添加为答案,这样您就可以像您所说的那样接受它,并可能点赞。然后让赏金到期-我认为这不会起作用,因为您还没有声望。
我暂时没有时间仔细阅读此内容,请查看此答案:WiX-installer With Configurable Feature Directory(位于中间部分,如果相关,则还有其他答案)。这些是“特征目录”,可以链接到实际目录属性,如链接中所述。
上面的示例使用了WiX Mondo对话框集。 我在这里描述了使用Mondo对话框集进行最小化WiX编译的设置。基本上是一个“Hello WiX”项目,但您已经掌握了这个方法。只是添加它以防其他人可能会发现它有用。
更新:我的简短测试似乎表明,系统会为大多数安装模式持久化此类功能目录,但不适用于主要升级。要读取这些自定义文件夹的先前设置,您需要使用AppSearch或自定义操作,并且应该使您的设置在注册表中保留目录属性。

一些指针

这些只是快速测试的一些建议。请像往常一样仔细测试自己。在Windows Installer中有很多我称之为“阴谋复杂性”的问题-例如,当您尝试交付升级时,问题会意外地浮出水面。 在安装期间将属性(功能目录属性)保存在注册表中
<!--Put this inside a component-->
<RegistryKey Root="HKLM" Key="Software\MyCompany\MyApp" ForceCreateOnInstall="yes">
  <RegistryValue Type="string" Name="MYCUSTOMDIR" Value="[MYCUSTOMDIR]" KeyPath="yes"/>
</RegistryKey>

<!--Put this inside a component-->
<RegistryKey Root="HKLM" Key="Software\MyCompany\MyApp" ForceCreateOnInstall="yes">
  <RegistryValue Type="string" Name="MYCUSTOMDIRTWO" Value="[MYCUSTOMDIRTWO]" KeyPath="yes"/>
</RegistryKey>

重要提示!:这将写入到HKLM\SOFTWARE\WOW6432Node\MyCompany\MyApp - 在64位操作系统上的32位注册表部分。您可能需要从64位部分中读写。如果需要,请只需在组件和RegistrySearch元素中添加Win64="yes"属性。

链接:http://robmensching.com/blog/posts/2010/5/2/the-wix-toolsets-remember-property-pattern/

接下来使用注册表搜索将它们读回:

<Property Id="MYCUSTOMDIR">
  <RegistrySearch Id='MYCUSTOMDIR' Root='HKLM' Key='Software\MyCompany\MyApp' Name='MYCUSTOMDIR' Type='raw' />
</Property>

<Property Id="MYCUSTOMDIRTWO">
  <RegistrySearch Id='MYCUSTOMDIRTWO' Root='HKLM' Key='Software\MyCompany\MyApp' Name='MYCUSTOMDIRTWO' Type='raw' />
</Property>    

在理想情况下,这应该足以满足您的目的。我没有时间测试在升级时在命令行设置这些属性会发生什么(这可能会发生)。
为了创建一个主要升级版本进行测试,您可以基本上只需将版本号的前三个数字之一提高并编译一个新的MSI(将旧的MSI重命名为输出文件夹中的保留文件)-并生成一个新的产品GUID(除非您将其设置为自动生成,在这种情况下,版本号的增加就足够了)。顺便说一下,MSI版本号只应具有3个数字,以符合MSI标准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接