我需要让MSI输出文件名包含\ bin文件夹中输出EXE的完整版本。像MyFile_x.x.x.x.msi
这样的东西这在.WXS文件中很有效,安装程序可以获取完整版本并在安装程序中显示它。但问题是你不能使用bind.FileVersion。在项目文件中
<?define ProductVersion=!(bind.FileVersion.$(var.Zygo.MetroProXP.UI.TargetFileName)) ?>
推荐的解决方案是使用GetAssemblyIdentiy方法重新定义输出文件名。
<GetAssemblyIdentity AssemblyFiles="$(OutDir)MyFile.exe">
<Output TaskParameter="Assemblies" ItemName="ProductAssembly" />
</GetAssemblyIdentity>
<CreateProperty Value="$(OutputName)%(ProductAssembly.Version)">
<Output TaskParameter="Value" PropertyName="TargetName" />
</CreateProperty>
我的问题是返回的版本只有Major.Minor.Build,我需要完整版Major.Minor.Build.Release。这是因为GetAssemblyIdentity返回AssemblyVersion而不是AssemblyFileVersion。它确实有版本号的第4部分。有谁知道如何获得重命名MSI文件的完整版本?
答案 0 :(得分:1)
我能够使用内联任务使其工作。
<UsingTask TaskName="GetFileVersionTask"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<AssemblyPath ParameterType="System.String" Required="true" />
<VersionNumber ParameterType="System.String" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Code Type="Fragment" Language="cs">
<![CDATA[this.VersionNumber = FileVersionInfo.GetVersionInfo(this.AssemblyPath).FileVersion;]]>
</Code>
</Task>
然后只更改了输出目录
<Target Name="BeforeBuild">
<GetFileVersionTask AssemblyPath="$(OutDir)MyEXEFile.exe">
<Output TaskParameter="VersionNumber" PropertyName="VersionNumber" />
</GetFileVersionTask>
<CreateProperty Value="$(OutputName)$(VersionNumber)">
<Output TaskParameter="Value" PropertyName="TargetName" />
</CreateProperty>
<CreateProperty Value="$(TargetName)$(TargetExt)">
<Output TaskParameter="Value" PropertyName="TargetFileName" />
</CreateProperty>
<CreateProperty Value="$(TargetDir)$(TargetFileName)">
<Output TaskParameter="Value" PropertyName="TargetPath" />
</CreateProperty>
答案 1 :(得分:0)
FWIW,我记得有些关于添加更多活页夹变量的喋喋不休。这个想法被接受,因为担心放慢WiX读取大多数人永远不会使用的东西。
MSBuild有一个名为Property Functions的概念。您可能会想出一个表达式,该表达式获取文件的版本号并将其附加到输出名称。
只是一个FYI。如果您更改了MSI文件名,请注意您将被迫进行重大升级。