在WiX中TARGETDIR和INSTALLDIR的用途是什么?

Ada*_*son 19 wix

在传统的Visual Studio部署项目安装程序中,传递指定值的命令行参数TARGETDIR允许我覆盖默认安装位置(我的大多数安装都是在没有用户交互的情况下进行的,因此大量使用命令行自动化).但是,我得到的印象是WiX(默认情况下)TARGETDIR用于不同的东西.虽然我可以(并且将会)更新我们的命令行工具来更改参数名称,但仍然需要手动触摸所有现有的安装(非常重要的工作).

有没有办法通过指定TARGETDIR而不破坏任何东西来覆盖WiX包中的安装位置?

Ada*_*son 27

在进行了更多的挖掘之后,看起来我以前的经验是VSDPROJ(以及可能的InstallShield)特有的行为的结果,而且WiX符合Windows Installer.

正如我在此链接中发现的那样,TARGETDIR实际上应该代表具有最多可用空间的驱动器的根(假设有多个).这就是为什么WiX项目将目录嵌套在Program Files等下面的原因.Visual Studio实际上添加了一个自定义操作,将该属性覆盖到完整的安装路径.

通过做两件事,我能够完成我想要的任务:

  1. 将所有组件和组件组更改为安装TARGETDIR而不是INSTALLFOLDER(WiX放在那里的默认目录)
  2. 添加一个自定义操作,将TARGETDIR属性的值设置为安装路径,假设没有从命令行传入.

为此,我在<Product>标签下添加了这个:

<CustomAction Id="SetTARGETDIR" Property="TARGETDIR" 
              Value="[ProgramFilesFolder][Manufacturer]\[ProductName]" 
              Execute="firstSequence" />
Run Code Online (Sandbox Code Playgroud)

这在<InstallExecuteSequence>标签内:

<Custom Action="SetTARGETDIR" Before="CostFinalize">TARGETDIR=""</Custom>
Run Code Online (Sandbox Code Playgroud)

  • 这个 WiX 软件非常晦涩难懂,而且文档记录也很糟糕。如果没有 Stack Overflow,就不可能使用它。 (8认同)
  • 从 Wix 3.x 开始,我会这样写 `&lt;SetProperty Id="TARGETDIR" Value="[ProgramFilesFolder][Manufacturer]\[ProductName]" Sequence="first" Before="CostFinalize"&gt;NOT Installed AND NOT TARGETDIR&lt; /设置属性&gt;`。请注意,我在条件中添加了“未安装”,因为安装目录只能在首次安装时更改。在维护模式下,Windows Installer 会将目录属性设置为不应更改的实际安装路径。 (2认同)