我如何基于GitVersion属性为我的WiX安装程序项目命名输出?

14

我最近开始使用GitVersion对我的程序集进行版本管理,并且我很喜欢它!

我想生成一个反映正在构建的产品版本的.msi文件。迄今为止,我在我的.wixproj文件中使用了以下内容:

  <!-- [TPL] name the output file to include the version from theLocalServer assembly -->
  <Target Name="BeforeBuild">
    <GetAssemblyIdentity AssemblyFiles="$(SolutionDir)BuildOutput\$(Configuration)\TA.DigitalDomeworks.Server.exe">
      <Output TaskParameter="Assemblies" ItemName="AssemblyVersions" />
    </GetAssemblyIdentity>
    <CreateProperty Value="$(OutputName).%(AssemblyVersions.Version)">
      <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>
  </Target>

这将生成一个类似以下名称的输出文件:

TA.DigitalDomeworks.Installer.7.1.0.3.msi

我从这个答案中找到了这个解决方案,它引用了这篇博客文章。其中的7.1.0.3来自生成中主程序集的程序集版本,而该版本在其自己构建期间由GitVersion进行版本控制。

但是,我真正想要的是使用FullSemVer属性,可以在此处看到:

C:\Users\Tim\source\repos\TA.DigitalDomeworks [release/7.11 +0 ~1 -0 !]> gitversion
{
  "Major":7,
  "Minor":1,
  "Patch":0,
  "PreReleaseTag":"beta.3",
  "PreReleaseTagWithDash":"-beta.3",
  "PreReleaseLabel":"beta",
  "PreReleaseNumber":3,
  "BuildMetaData":"",
  "BuildMetaDataPadded":"",
  "FullBuildMetaData":"Branch.release/7.1.Sha.77fa2c96ed9b0f5ab162d07052ef094e8ccfc8c5",
  "MajorMinorPatch":"7.1.0",
  "SemVer":"7.1.0-beta.3",
  "LegacySemVer":"7.1.0-beta3",
  "LegacySemVerPadded":"7.1.0-beta0003",
  "AssemblySemVer":"7.1.0.3",
  "FullSemVer":"7.1.0-beta.3",
  "InformationalVersion":"7.1.0-beta.3+Branch.release/7.1.Sha.77fa2c96ed9b0f5ab162d07052ef094e8ccfc8c5",
  "BranchName":"release/7.1",
  "Sha":"77fa2c96ed9b0f5ab162d07052ef094e8ccfc8c5",
  "NuGetVersionV2":"7.1.0-beta0003",
  "NuGetVersion":"7.1.0-beta0003",
  "CommitsSinceVersionSource":3,
  "CommitsSinceVersionSourcePadded":"0003",
  "CommitDate":"2018-09-10"
}

所以我想看到的最终文件名是:

TA.DigitalDomeworks.Installer-7.1.0-Beta.3.msi

在GitVersion文档中,它说我需要确保执行了GitVersion.GetVersion构建任务,之后我应该能够从一个叫做$(GitVersion_FullSemVer)的构建属性中获取完整的SemVer。

但是,我不确定如何在WiX项目中实现这一点,因为安装GitVersionTaskNuGet包似乎没有任何作用(在C#项目中,一切都会神奇地运行)。如果我能够执行GitVersion.GetVersion任务,那么我认为我可以清楚地看到我想要的输出名称。

有人成功实现了吗?或者有人能够提供如何解决此问题的建议吗?


注意:如果计划使用小型升级,则更改安装程序的输出名称似乎是一个不好的主意。然而,我只在我的安装程序中使用主要升级,所以我可以接受这种限制。 - Tim Long
2个回答

6
我明白了。我一开始就在正确的方向上。无需手动执行GitVersion.GetVersion,只要在WiX项目中安装了GitVersionTask NuGet包,MSBuild就会正确处理它。之前无法正常工作的原因是我试图在设置GitVersion属性之前使用它们。
所以,首先要创建一些属性来禁用一些不需要的GitVersion操作:
  <PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <WriteVersionInfoToBuildLog>false</WriteVersionInfoToBuildLog>
    <GenerateGitVersionInformation>false</GenerateGitVersionInformation>
  </PropertyGroup>

我们不能简单地更改OutputName属性,因为它在任何任务(包括GitVersion任务)执行之前就已经设置了,因此如果我们试图在那里使用GitVersion属性,它们将为空/未设置,因为GitVersion目标尚未执行。相反,我们必须将一些逻辑放入构建目标中,显然的候选者是通常位于项目文件末尾的BeforeBuild目标:

  <Target Name="BeforeBuild" AfterTargets="GetVersion">
    <CreateProperty Value="$(OutputName).$(GitVersion_SemVer)">
      <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>
  </Target>

我们在这里使用OutputName属性作为基础名称,并添加所需的GitVersion属性,创建TargetNameTargetFileNameTargetPath属性,这些属性将在其余的构建过程中使用。这样做是因为BeforeBuild任务保证在生成任何输出文件之前执行,所以所有的Target*属性都会在那之前设置。


你想对Wix项目本身进行版本管理,还是主要的程序集项目?我觉得你想要的是主要的程序集项目。 - koolkoda
@Tim Long,太好了,你解决了它,我删除我的答案,因为它不相关。 - Jens Granlund

1

让我们看看这是否解决了你的问题

我的方法如下:

将以下内容添加到主程序集项目中,而不是wix项目中。

<Target Name="WriteVersionToFile" AfterTargets="GetVersion">
        <WriteLinesToFile File="$(OutputPath)version.txt" Lines="$(GitVersion_FullSemVer)" Overwrite="true" Encoding="Unicode" /> 
</Target>

然后将您的wix项目中的BeforeBuild目标替换为以下示例

<Target Name="BeforeBuild">
    <ReadLinesFromFile File="$(SolutionDir)BuildOutput\$(Configuration)\version.txt">  
        <Output TaskParameter="Lines" ItemName="Version" />  
    </ReadLinesFromFile>
    <CreateProperty Value="$(OutputName).$(Version)">
      <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>
  </Target>

该解决方案在运行GetVersionTask后,向文本文件添加GitVersion_FullSemVer属性。然后,在wix项目中使用此数据对msi文件进行版本控制。

谢谢您的建议。这个方法也许可行,但我不想写出一个文本文件,如果可以避免的话。我讨厌使用文件系统作为临时变量!幸运的是,我找到了一个更优雅的解决方案,并将其发布为单独的答案。 - Tim Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接