【问题标题】:WiX Change product name conditionallyWiX 有条件地更改产品名称
【发布时间】:2020-01-15 22:24:16
【问题描述】:

我有一个大的 .wxs 文件,并且需要在安装程序时将 产品名称MyApp Workstation 版本 更改为 MyApp Server 版本在 Windows 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]"/>

我希望这对其他人也有帮助。祝你好运。

【问题讨论】:

  • 今晚没时间正确回答。但是:预处理器变量是编译时构造,您可以使用它来编译设置的单独版本。这就是我提供服务器和工作站设置的方式,以便它们可以独立修复错误,例如 - more on that here
  • 在运行时通过自定义操作设置 ProductName 属性可能有效,但我不建议这样做,因为该属性涉及产品注册。两个版本的 MSI 文件名必须保持相同以支持修补(不确定产品名称)。但是,您可以在转换中更改 ProductName - 用于自定义 MSI 文件以进行企业部署的概念。例如,启动器 setup.exe 可以在运行时应用“服务器转换”来更改产品名称。
  • See my comments on patching here。还有其他方法可以根据涉及 GUI 更改的目标机器显示自定义文本。 您真正需要什么? 设置是否应该更改其他内容,还是“显示问题”?也许您安装了不同的功能?
  • 只是显示问题。没有什么真正改变,功能是一样的。这是一个 PM 的东西,它希望根据操作系统显示不同的字符串。

标签: wix windows-installer conditional-statements


【解决方案1】:

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

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

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

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

【讨论】:

  • 通过一些 GUI 黑客攻击,他可以创建一个新的标签字段来显示不同的显示名称?努力工作和容易出错却收获很少?也许只是注入一个新的欢迎对话框?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多