我编写了一个应用程序及其WiX安装程序,并使用subversion将其置于版本控制之下.当WiX安装程序构建时,我希望其版本号是应用程序的当前构建版本.我该如何做到这一点?我使用c#来编写应用程序代码.
NB我正在使用ccnet来构建这个项目
Rob*_*ing 170
你可以使用产品/ @版本="!(bind.FileVersion.FileId)"(替换FileId用Id的文件,从中你想要得到的版本号),并light.exe将的版本填充值文件引用的FileId.
Chr*_*zor 36
我在我的一个项目中通过编写预处理器扩展来从可执行文件中读取文件版本.所以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>">
Run Code Online (Sandbox Code Playgroud)
我在CodePlex上发布了代码:http: //wixfileversionext.codeplex.com/
K0D*_*0D4 24
如果有人正在寻找一个实际的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>
Run Code Online (Sandbox Code Playgroud)
Bro*_*ley 19
这是一个非常简单的方法,让你的Bootstrapper Bundle版本与你的MyApp AssemblyVersion匹配使用BeforeBuild Target和DefineConstants.
Bundle.wxs:
<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
Version="$(var.BuildVersion)"
Run Code Online (Sandbox Code Playgroud)
Bootstrapper.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>
Run Code Online (Sandbox Code Playgroud)
您可以将版本传递给安装项目的 MSBuild 脚本,就像传递应用程序的构建脚本一样。
例如,如果您的 CI 系统定义了变量AppVersionand BuildNumber,并将它们传递给您的 MSBuild 脚本,您的 wixproj 可以创建一个相应的Version属性,它会像这样转发给 Wix:
<PropertyGroup>
<Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
<Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
<DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
第一个定义Version为您在本地构建时提供了默认值。无论最终结果如何,都将成为VersionWix 中的一个变量。在 wsx 文件中使用它,如下所示:
<Product Version="$(var.Version)" ...>
<Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />
Run Code Online (Sandbox Code Playgroud)
我喜欢在描述中包含版本,以便可以轻松地从 Window Explorer(作为详细信息视图或属性页面中的列)进行查找,而不受文件名的影响。
将版本作为变量传递给你比从文件中读取它更多的控制。当您从文件中读取时,您将获得程序化版本的所有 4 个部分。但是,ProductVersion仅设计为使用前 3 个部分。
这看起来相当接近您想要完成的任务。看看巡航控制系统中的等效项是什么。
http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/