【问题标题】:WIX UI for multiple target directories用于多个目标目录的 WIX UI
【发布时间】:2018-02-02 08:16:23
【问题描述】:

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

我有这个目录结构:

<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" />

为了覆盖单个 InstallDirDialog,我复制了 WIXUI_InstallDir.wxs 和 InstallDirDlg.wxs 文件。我复制了 InstallDirDlg.wxs 并将数字 1 和 2 添加到文件的末尾,在所有三个前缀上加上 custom_ 并相应地更改了它们的 UI-Tags:

现在,在 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(朝向中间,如果看起来还有其他答案相关)。
  • 非常感谢。这实际上帮助了我很多。遗憾的是我没有找到它,因为我一直在寻找“多个自定义目标目录”等。如果你愿意,我可以给你赏金:D 实际上,目前我什至不能在你链接的这篇文章上投票给你的答案,因为我没有足够的声誉:D
  • 暂时不用担心赏金问题,如果有帮助,请尝试一下。我没有对其进行太多测试 - 请进行测试并让我们知道您发现了什么。该对话框来自 WiX Mondo 对话框集顺便说一句 - 但我假设您已经解决了所有这些问题? I describe setting up a minimal WiX compile with the Mondo dialog set here.
  • 是的,我根据您使用功能来区分软件各部分的想法进行了整理;以便每个都可以安装到不同的目录。我还确保不能通过将它们的“缺席”标志设置为 false 来禁用这些“功能”,并将相应的组件设置为 location="local",以便无法选择“从网络安装”选项用户。
  • 好的,太好了。请务必检查使用这种方法(安装、修复、修改、自我修复、修补等)在不同安装模式下会发生什么。 MSI 通常不会自动保存属性,但功能目录可能会 - 不幸的是,我没有足够地使用它们来确定。另请注意,它们可能可以在命令行中设置并因此覆盖。我明天应该测试一下。如果我完成了,我会通知你的。

标签: user-interface wix windows-installer wix3.5


【解决方案1】:

也许我会把它添加为答案,这样你就可以像你说的那样接受它——也许还可以投票。然后让赏金用完 - 我认为它不会起作用,因为你还没有声望。

我目前没有时间详细阅读此内容,但请看一下这个答案:WiX-installer With Configurable Feature Directory(朝向中间,如果看起来相关,还有其他答案)。这些是“功能目录”,可以链接到链接中描述的实际目录属性。

上面的示例使用了 WiX Mondo 对话框集。 I describe setting up a minimal WiX compile with the Mondo dialog set here。本质上是一个“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 位部分进行写入和读取。如果是这样,只需将 Win64="yes" 属性添加到组件和 RegistrySearch 元素。

一个链接: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 以保留它) - 并生成一个新的产品 G​​UID(除非您将其设置为自动生成,在这种情况下版本增加就足够了)。顺便说一下,MSI 版本号应该只有 3 位数字才能符合 MSI 标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多