我正在创建一个由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目标没有?
答案 0 :(得分:33)
我终于找到了问题所在。 在搜索了一段时间后,我看到了这个文件:
相关部分:“目录ID必须全部为大写字符,因为它必须从UI传递到执行序列才能生效。”
正如您在我的代码中看到的那样:“Myapp_Installer_Dir”不符合此标准。
将其更改为“MYAPPINSTALLERDIR”后,一切正常。
答案 1 :(得分:3)
我不太确定,但这就是我认为发生的事情。
当您创建SetDirectory
元素时,您基本上添加了一个自定义操作,该操作将目录设置为MSI数据库。只要您没有指定执行序列,它就默认为both
,这意味着在InstallUISequence
和InstallExecuteSequence
中执行。
现在,当用户更改向导中的安装目录时,会在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 示例中没有提到这一重要事实。