如何在WiX中使用light.exe在命令行引用变量

如何在WiX中使用light.exe在命令行引用变量,wix,windows-installer,Wix,Windows Installer,我读过一些参考文献,它们似乎建议在命令行中引用bind或WiX变量。这将使我能够将程序集信息添加到生成的MSI的名称中。比如说, light.exe ... -out Installer.!(bind.FileVersion.myExe).msi ... light.exe ... -out Installer.!(wix.BlahInfo).msi ... 肯定有一些验证正在进行。如果WXS文件和light.exe命令中的引用之间的WixVariable ID名称不同,则会出现错误: lig

我读过一些参考文献,它们似乎建议在命令行中引用bind或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 ...

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

Light不支持命令行上的绑定时间变量引用。

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

light.exe ... -out Installer.%BLAH_VERSION%.msi
要做到这一点,需要做很多事情。首先,我的版本号来自VisualStudio项目的程序集信息。我要做的第一件事是使它动态化,以便为每个构建创建一个新的。将最后2个数字更改为a*可以:

[assembly: AssemblyVersion("6.4.*")]
<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>
下一步要做的是将这个数字具体化,以便它可以在其他地方使用。将此节添加到csproj的末尾可以:

[assembly: AssemblyVersion("6.4.*")]
<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>

$(PostBuildEventDependsOn);
构建后宏;
setx BLAH_版本@(版本号)

当然,要引用它,我需要找到一种方法来获取已打开的命令提示符,以更新对环境变量的引用

因此,现在我已经使用windows批处理脚本将其绑定在一起。基本上,我构建EXE,测试它,确保它是好的,运行我的批处理脚本,我有一个以为我生成的程序集信息版本命名的MSI文件