我编写了一个应用程序及其 WiX 安装程序,并使用 subversion 将其置于版本控制之下。当 WiX 安装程序构建时,我希望它的版本号是应用程序的当前构建版本。我该怎么做?我使用 c # 来编写应用程序。
注意: 我正在使用 ccnet 来建立这个项目
这看起来与您要完成的任务相当接近,看看巡航控制中的等价物是什么。
Http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/
您可以使用 Product/@Version="!(bind.FileVersion.FileId)"(用希望从中获取版本号的文件的 Id替换 FileId) ,light.exe 将使用 FileId引用的文件的版本填充该值。
Product/@Version="!(bind.FileVersion.FileId)"
Id
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 Target和 DefineConstants使您的 Bootstrapper Bundle Version 与 MyAppAssemblyVersion 匹配。
BeforeBuild Target
DefineConstants
返回文章页面 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 系统定义了变量 AppVersion和 BuildNumber,并将它们传递给 MSBuild 脚本,那么 wixproj 可以创建相应的 Version属性,并将其转发给 Wix,如下所示:
AppVersion
BuildNumber
Version
<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部分。