首页 > 解决方案 > WiX 有条件地更改产品名称

问题描述

我有一个大的 .wxs 文件,并且需要在 Windows Server 操作系统上启动安装程序时将产品名称MyApp Workstation 版本更改为MyApp Server 版本。我读了很多,我发现我需要与以下 MSI 属性MsiNTProductType相关,它为工作站返回值 1,为服务器操作系统返回值 2 或 3。

<?xml version="1.0" encoding="UTF-8"?>
<?define ProductName = "MyApp Workstation version" ?>

<Wix>  
  <Product Name="$(var.ProductName)" ... >
     ...
  </Product>
</Wix>

如果我使用如下条件,它会检测到我使用的是工作站操作系统(在我的情况下为 Windows 10),但这不是我想要的:

<Condition Message="This installer is for Windows Server only!">
      <![CDATA[(MsiNTProductType > 1)]]>
</Condition>

我尝试了预处理器变量方法,但显然它不起作用:

<?if MsiNTProductType = 1 ?>
<?define ProductName = "MyApp Workstation version" ?>
<?else ?>
<?define ProductName = "MyApp Server version" ?>
<?endif ?>

我还尝试了SetPropertyCustomAction,但没有任何运气。我被困在这一点上。

有可能做这样的事情吗?为了实现这一点,我必须做出哪些改变?我对 WIX 很陌生,我不明白它应该如何工作。谢谢你。

后期编辑和解决方案

在尝试了数十种组合很多天之后,我能够使用以下代码来做到这一点,这些代码放在已经定义的任何 CustomAction 之前:

<Property Id="ConditionalProductName" Value="MyApp Workstation version" />    
<SetProperty Id="ConditionalProductName" Before="LaunchConditions" Value="MyApp Server version" >
   <![CDATA[(MsiNTProductType > 1)]]>
</SetProperty>
<SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[ConditionalProductName]"/>

我希望这也可以帮助其他人。祝你好运。

标签: wixwindows-installerconditional-statements

解决方案


ProductName 属性只能在安装开始之前更改。一旦 MSI 运行,它就是不可变的。

您尝试的预处理器语句影响构建时间而不是安装时间。

做你想做的事情的唯一方法是创建一个具有不同名称的转换,然后使用引导程序在非服务器操作系统上安装没有转换的 MSI,并在服务器操作系统上安装带有转换的 MSI。

就个人而言,这不是典型的做法,所以我会拒绝 PM 的要求。我会努力的唯一原因是业务真的在营销方面真正区分了品牌。否则通常不会这样做。


推荐阅读