Answers:
你可以使用Product/@Version="!(bind.FileVersion.FileId)"
(替换FileId
用Id
从您想要得到的版本号文件)和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/
<?define ProductName="!(bind.property.ProductName)" ?><?define CompanyName="!(bind.property.Manufacturer)" ?><?define ProductVersion=!(bind.FileVersion.FileId) ?>
其中的其中一个元素FileId
的Id
属性值在哪里工作。File
Component
如果有人在寻找实际的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>
!(bind.fileVersion.MyDLL)
它会使用第三部分来引用该<File Id="MyDLL"...
部分
这是一种非常简单的方法,可以使用BeforeBuild Target
和来获取Bootstrapper捆绑软件版本以匹配MyApp AssemblyVersion DefineConstants
。
Bundle.wxs:
<Bundle Name="$(var.ProductName) Bootstrapper v$(var.BuildVersion)"
Version="$(var.BuildVersion)"
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>
var.ProductName
并且var.BuildVersion
位于您上方的某个位置<Bundle>
?
BeforeBuild
目标,因此可能需要明确指定AfterTargets="AfterResolveReferences"
是否在IDE中构建
您可以将版本传递给安装项目的MSBuild脚本,就像传递应用程序的构建脚本一样。
例如,如果您的CI系统定义了变量AppVersion
和BuildNumber
,并将它们传递给MSBuild脚本,则wixproj可以创建一个相应的Version
属性,将其转发给Wix,如下所示:
<PropertyGroup>
<Version Condition=" '$(BuildNumber)' == '' ">0.0.1</Version>
<Version Condition=" '$(BuildNumber)' != '' ">$(AppVersion).$(BuildNumber)</Version>
<DefineConstants>Version=$(Version)</DefineConstants>
</PropertyGroup>
第一个定义Version
为您在本地构建时提供默认设置。无论最终结果如何,都将成为Version
Wix中的变量。像这样在wsx文件中使用它:
<Product Version="$(var.Version)" ...>
<Package Description="$(var.ProductName) $(var.Version): $(var.ProductDescription)" ... />
我希望在说明中包括该版本,以便可以从Window Explorer(作为“详细信息”视图中的列或“属性”页面上的列)轻松查找,而与文件名无关。
与从文件读取版本相比,将版本作为变量传递给您更多的控制权。从文件读取时,将获得编程版本的所有4个部分。但是,ProductVersion仅设计为使用前3个部分。
<Version Condition=" '$(BuildVersionOfAsm)' != '' ">$(BuildVersionOfAsm)</Version>
看来,这是:尽管BuildVersionOfAsm是devops管道中的变量。
这看起来与您要实现的目标相当接近。看看巡航控制中的等效功能。
http://www.ageektrapped.com/blog/setting-properties-for-wix-in-msbuild/