Wix - 正确设置安装文件夹

时间:2013-10-14 07:43:33

标签: wix installation

我正在创建一个由Wix安装的程序,使用VS 2010,我已经准备好了product.wxs。

在我的wxs文件中,我的目录定义如下:

<SetDirectory Id="INSTALLFOLDER" Value="[WindowsVolume]Myapp" />
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="INSTALLFOLDER" Name="Myapp">
    <Directory Id="Myapp_Installer_Dir" Name="Myapp">
          <Directory Id="BIN" Name="Bin" />
          <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

然后我得到了这些文件安装定义:

<DirectoryRef Id="Myapp_Installer_Dir">
  <Component Id="INSTALLER_Myapp" Guid="{94F18477-8562-4004-BC6F-5629CC19E4CB}" >
    <File Source="$(var.Myapp.TargetPath)" KeyPath="yes"/>
  </Component>
</DirectoryRef>

<DirectoryRef Id="BIN">
  <Component Id="INSTALLER_Data" Guid="{545FB5DD-8A52-44D7-898E-7316E70A93F5}" >
    <File Source="$(var.Data.TargetPath)" KeyPath="yes"/>
  </Component>
    ...

它继续以这种方式。还定义了“ICONS”目录的文件。

我也在使用WixUI_InstallDir对话框,我也提供了这些行:

<Property Id="WIXUI_INSTALLDIR" Value="Myapp_Installer_Dir" />
<UIRef Id="WixUI_InstallDir" />

问题是当用户安装程序并更改安装文件夹的值时,“Bin”和“Icons”的文件安装到正确的路径,但Myapp目标安装到修复位置,在开始时被定义为默认安装路径。

为什么只将bin和icon文件安装到用户想要的正确文件夹中,但是myapp目标没有?

3 个答案:

答案 0 :(得分:33)

我终于找到了问题所在。 在搜索了一段时间后,我看到了这个文件:

WixUI_InstallDir Dialog Set

相关部分:“目录ID必须全部为大写字符,因为它必须从UI传递到执行序列才能生效。”

正如您在我的代码中看到的那样:“Myapp_Installer_Dir”不符合此标准。

将其更改为“MYAPPINSTALLERDIR”后,一切正常。

答案 1 :(得分:3)

我不太确定,但这就是我认为发生的事情。

当您创建SetDirectory元素时,您基本上添加了一个自定义操作,该操作将目录设置为MSI数据库。只要您没有指定执行序列,它就默认为both,这意味着InstallUISequenceInstallExecuteSequence 中执行。

现在,当用户更改向导中的安装目录时,会在UI序列中发生这种情况。显然,当安装进入执行序列时,INSTALLFOLDER的值按照指示设置为[WindowsVolume]Myapp

所以,你必须以某种方式重做这件事。请记住静默安装 - 那里只有执行顺序。

更新而不是你拥有的东西,尝试这样的事情:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="WindowsVolume">
    <Directory Id="INSTALLFOLDER" Name="Myapp">
      <Directory Id="BIN" Name="Bin" />
      <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

让用户可以选择更改INSTALLFOLDER

答案 2 :(得分:0)

除了大写字母的陷阱之外,还有一个:

您必须将可更改目录的 ID 标记为安全。(至少当设置以管理员权限运行时。)

与目录 ID MYAPPINSTALLERDIR 的 Yonatan 的回答相关,您必须添加以下内容:

<Property Id="MYAPPINSTALLERDIR" Secure="yes" />

与 WiX 文档中的示例 WixUI_InstallDir 相关,您必须添加:

<Property Id="TESTFILEPRODUCTDIR" Secure="yes" />

遗憾的是,WiX 示例中没有提到这一重要事实。