首页 > 解决方案 > 如何在 WiX 中使用 light.exe 在命令行中引用变量

问题描述

我已经阅读了似乎暗示能够在命令行中引用绑定或 WiX 变量的参考资料(这个是最明显的)。这将使我能够将程序集信息添加到生成的 MSI 的名称中。例如,

light.exe ... -out Installer.!(bind.FileVersion.myExe).msi ...
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

肯定有一些验证正在进行。如果 WXS 文件和 light.exe 命令中的引用之间的 WixVariable ID 名称不同,我会收到错误消息:

light.exe : error LGHT0197 : The Windows Installer XML variable !(wix.BlahInfo1) is unknown

如果我确保它们匹配,那么错误就会消失:

<WixVariable Id="BlahInfo" Value='!(bind.FileVersion.myExe)'/>
light.exe ... -out Installer.!(wix.BlahInfo).msi ...

但是,无论我尝试什么,生成的 MSI 文件都不会进行运行时变量替换。相反,它只是将 !(...) 添加到文件名中。例如,我的最后一次构建生成了一个具有以下名称的文件:

Installer.!(wix.BlahInfo).msi

这是可以做到的还是我误解了文档?谢谢。

标签: wixwindows-installer

解决方案


所以我得出了和鲍勃一样的结论。这是不可接受的,因为它在构建中引入了太多的可变性,所以我以不同的方式解决了它。我知道在命令行运行的可执行文件可以在运行时引用 Windows 环境变量。所以我需要做的就是设置一个环境变量并引用它,瞧:

light.exe ... -out Installer.%BLAH_VERSION%.msi

为了实现这一点,需要完成很多工作。首先,我的版本号来自 Visual Studio 项目的程序集信息。我必须做的第一件事是让它动态化,以便它为每个构建创建一个新的。将最后 2 个数字更改为 * 这样做:

[assembly: AssemblyVersion("6.4.*")]

接下来要做的是将这个数字外部化,以便可以在其他地方使用。将此节添加到 csproj 的末尾可以做到这一点:

<Target Name="PostBuildMacros">
  <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
    <Output TaskParameter="Assemblies" ItemName="Targets" />
  </GetAssemblyIdentity>
  <ItemGroup>
    <VersionNumber Include="@(Targets->'%(Version)')"/>
  </ItemGroup>
</Target>
<PropertyGroup>
  <PostBuildEventDependsOn>
    $(PostBuildEventDependsOn);
    PostBuildMacros;
  </PostBuildEventDependsOn>    
  <PostBuildEvent>setx BLAH_VERSION @(VersionNumber)</PostBuildEvent>
</PropertyGroup>

感谢这个 stackoverflow 帖子的帮助。

当然要引用它,我需要找到一种方法来获取已打开的命令提示符以更新其对环境变量的引用。 这被证明是最困难的,但这个 stackoverflow 帖子来拯救了。

所以现在我使用 Windows 批处理脚本将它们捆绑在一起。本质上,我构建了 EXE,对其进行测试,确保它是好的,运行我的批处理脚本,并且我有一个以为我生成的程序集信息版本命名的 MSI 文件。


推荐阅读