【问题标题】:Wix - Setting Install Folder correctlyWix - 正确设置安装文件夹
【发布时间】:2013-10-14 07:43:32
【问题描述】:

我正在使用 VS 2010 创建一个由 Wix 安装的程序,并且我已经准备好 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 目标却没有?

【问题讨论】:

    标签: wix installation


    【解决方案1】:

    我终于找到了问题所在。 找了一会儿,发现了这个文档:

    WixUI_InstallDir Dialog Set

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

    您可以在我的代码中看到:“Myapp_Installer_Dir”不符合此条件。

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

    【讨论】:

    • 如果字母大小写正确,但仍然无法按预期工作,那么值得修改 SetDirectory 操作,按照 Yan 的建议为其指定 Sequence(设置 @987654324 @ 在我的情况下成功了)。一般来说,问题可以通过详细的日志记录来追踪......
    【解决方案2】:

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

    当您创作 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

    【讨论】:

    • 您对这项工作有什么建议吗?我该怎么做?
    • 如果这不是您项目的严格要求,我会完全避免使用SetDirectory 部分。只需保留默认选项(我的意思是 ProgramFilesFolder)。并让用户只选择一个文件夹位置,其他路径应该建立相对于那个。
    • 我设置的这个文件夹必须是默认安装文件夹..我不能改变它
    • 没用...首先,默认位置已根据您添加的内容进行了更改,现在它在“Myapp”文件夹之前有一个“WindowsVolume”文件夹,它仍然是最后一个默认位置的文件夹。 (C:\Myapp\WidnowsVolume\Myapp 而不是没有“WindowsVolume”的相同路径)。此外,当我将安装位置更改为 C:\Myapp\aaa 时,Bin 和 Icons 文件夹安装在那里,但 myApp 目标路径安装到我使用“WindowsVolume”文件夹编写的默认位置,忽略了“aaa”文件夹我输入。
    • 所以,让我澄清一下:如果用户使用默认选项,您需要安装到C:\MyApp\(bin|icons),如果他更改目标位置,您需要安装到[INSTALLFOLDER]\(bin|icons),对吧?如果是这种情况,我已经更新了示例。尝试使用它,以防它无法开箱即用。
    【解决方案3】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多