我已经阅读了一些参考文献,这些参考文献似乎暗示了在命令行中引用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 ...
但是,无论我如何尝试,生成的MSI文件都不会执行运行时变量替换。相反,它只是将!(...)添加到文件名。例如,我的上一个版本生成了一个具有以下名称的文件:
Installer.!(wix.BlahInfo).msi
这是可以做的事情还是我误解了文档?谢谢。
因此,我得出了与鲍勃相同的结论。这是不可接受的,因为它在构建中引入了太多的可变性,因此我以不同的方式解决了它。我知道在命令行运行的可执行文件可以在运行时引用Windows环境变量。所以我要做的就是设置一个环境变量并引用它,瞧:
light.exe ... -out Installer.%BLAH_VERSION%.msi
为了实现这一目标,需要完成很多工作。首先,我的版本号来自Visual Studio项目的程序集信息。我要做的第一件事是使其动态化,以便为每个构建都创建一个新的。将最后两个数字更改为*可以做到:
[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帖子可以挽救了。
因此,现在我已使用Windows批处理脚本将它们捆绑在一起。本质上,我会生成EXE并进行测试,确保它运行良好,然后运行批处理脚本,并且我有一个以为我生成的程序集信息版本命名的MSI文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句