如何将 WiX 安装程序版本设置为当前构建版本?

我编写了一个应用程序及其 WiX 安装程序,并使用 subversion 将其置于版本控制之下。当 WiX 安装程序构建时,我希望它的版本号是应用程序的当前构建版本。我该怎么做?我使用 c # 来编写应用程序。

注意: 我正在使用 ccnet 来建立这个项目

77525 次浏览

这看起来与您要完成的任务相当接近,看看巡航控制中的等价物是什么。

Http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/

您可以使用 Product/@Version="!(bind.FileVersion.FileId)"(用希望从中获取版本号的文件的 Id替换 FileId) ,light.exe 将使用 FileId引用的文件的版本填充该值。

在我的一个项目中,我通过编写一个预处理器扩展来从可执行文件中读取文件版本。所以 WiX 文件看起来像这样:

<?define ProductName="$(fileVersion.ProductName($(var.MyApp.TargetPath)))" ?>
<?define CompanyName="$(fileVersion.CompanyName($(var.MyApp.TargetPath)))" ?>
<?define ProductVersion="$(fileVersion.ProductVersion($(var.MyApp.TargetPath)))" ?>
<Product
Id="<product ID>"
Name="$(var.ProductName)"
Version="$(var.ProductVersion)"
Manufacturer="$(var.CompanyName)"
Language="1033"
UpgradeCode="<upgrade code>">

我已经把代码发布在 CodePlex: http://wixfileversionext.codeplex.com/上了

这里有一个非常简单的方法,使用 BeforeBuild TargetDefineConstants使您的 Bootstrapper Bundle Version 与 MyAppAssemblyVersion 匹配。

返回文章页面 Bundle.wxs:

<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
Version="$(var.BuildVersion)"

Wixproj:

<Target Name="BeforeBuild">
<GetAssemblyIdentity AssemblyFiles="..\MyApp\bin\$(Configuration)\MyApp.exe">
<Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
</GetAssemblyIdentity>
<PropertyGroup>
<DefineConstants>BuildVersion=%(AssemblyVersion.Version)</DefineConstants>
</PropertyGroup>
</Target>

如果有人正在寻找一个实际的 XML 示例,那么可以使用。NET 程序集(并且不必执行 Assembly 或 KeyPath 属性)。我排除了与[ ... ]占位符无关的代码:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product [...] Version="!(bind.fileVersion.MyDLL)">
[...]
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="INSTALLDIR" Name="MyDLLInstallLocation">
<Component Id="MainLib" Guid="[...]">
<File Id="MyDLL" Name="MyDll.dll" Source="MyDll.dll" />
[...]
</Component>
[...]
</Directory>
</Directory>
</Directory>
</Product>
</Wix>

您可以将版本传递给安装项目的 MSBuild 脚本,就像传递给应用程序的生成脚本一样。

例如,如果 CI 系统定义了变量 AppVersionBuildNumber,并将它们传递给 MSBuild 脚本,那么 wixproj 可以创建相应的 Version属性,并将其转发给 Wix,如下所示:

<PropertyGroup>
<Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
<Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
<DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>

Version的第一个定义提供了在本地构建时的默认值。无论它最终得到什么,都会成为 Wix 中的 Version变量。在 wsx 文件中使用它,如下所示:

<Product Version="$(var.Version)" ...>
<Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />

我喜欢在描述中包含版本,这样就可以很容易地从 Windows 资源管理器(作为“详细信息”视图中的列或“属性”页面中的列)中查找,而与文件名无关。

将版本作为变量传递给您比从文件中读取更多的控制权。当您从一个文件中读取数据时,您将获得编程版本的所有4个部分。然而,ProductVersion仅仅设计用于前3部分。