Wix实现条件安装

11

能否在Visual Studio配置环境中使用条件安装配置?例如,选择DEBUG或RELEASE配置时,Wix会在构建的安装包中选择不同的可执行文件。

基本上,我需要从同一项目构建不同的安装包,但它们由组件区分。有些组件来自同一项目,但使用不同的预处理器选项进行构建。

当然可以包含每个所需的组件,然后定义功能以选择安装的特定组件,但我真的不想重新分发某些可执行文件。

构建不同的Wix项目是唯一的解决方案吗?

3个回答

14

将其他两个答案和Luca的研究结合起来,我提出了这个解决方案,它似乎可以工作(请注意,字符串比较似乎是区分大小写的,缺少引号似乎是正确的,我已经用WiX 3.7测试过了):

<?if $(var.Configuration) = Debug ?>
  <!-- DEBUG ONLY -->

  [ ... insert debug only XML here ... ]

  <!-- END DEBUG ONLY -->
<?else?>
  <!-- RELEASE ONLY -->

  [ ... insert release only XML here ... ]

  <!-- END RELEASE ONLY -->
<?endif?>

2
<?else> should be <?else?> - Bishoy
@BrainSlugs83 我遇到了“预处理器变量 '$(Configuration)' 格式不正确。变量必须有前缀(如 'var.'、'env.' 或 'sys.')和至少 1 个字符的名称。如果需要字面字符串 '$(Configuration)',请使用 '$$(Configuration)'。有什么想法吗? - user95227
@user95227 请仔细查看,应该是 $(var.Configuration) 而不是 $(Configuration) - BrainSlugs83
$(var.Configuration) 在 Wix 4.0 中无效。 - Ajay

8

您的Wix脚本可以访问构建参数,例如配置('debug'或'release')。因此,您可以通过在组件声明中引用$(var.Configuartion)来有条件地包含当前配置的正确二进制文件:

<Component Id="myProject.dll"
               DiskId="1"
               Guid="*">
  <File Id="myProject.dll"
            Name="myProject.dll"
            Source="..\myProject\bin\$(var.Configuration)\myProject.dll" />
</Component>

当您以发布模式运行构建时,此脚本将选择发布版本的二进制文件。同样,在调试模式下,将选择调试二进制文件。这种方法不需要预处理-脚本在构建时做出与配置相关的决策。

1
这对于查找路径非常有用 - 但是如果我想有条件地包含某些文件而不包含其他文件怎么办?(因此,提出了这个问题。)例如,在调试构建中,我可能希望包括.pdb文件,并在发布构建中不包括它们(因为这些文件有时每个文件都超过20 MB)。 - BrainSlugs83

7
使用预处理器,例如:<?if?>,根据配置条件性地包含/排除组件。

我从没想过Wix可以有预处理器!我找到了这个人:http://wix.sourceforge.net/manual-wix2/preprocessor.htm - Luca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接