如何根据 GitVersion 属性命名我的 WiX 安装程序项目的输出?
How can I name the output from my WiX Installer project based on GitVersion properties?
我最近开始使用 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
我从 this answer, which references this blog post 找到了这个解决方案。 7.1.0.3
来自构建中主程序集的程序集版本,而后者又在其自己的构建期间由 GitVersion 进行版本控制。
不过,我真正喜欢的是使用 FullSemVer
属性,可以在这里看到:
C:\Users\Tim\source\repos\TA.DigitalDomeworks [release/7.1 ↑1 +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
构建任务已执行,之后我应该能够从名为 属性 的构建中获得完整的 SemVer =17=].
但是,我不确定如何在 WiX 项目中实现这一点,因为安装 GitVersionTask
NuGet 包似乎没有任何作用(在 C# 项目中,一切都神奇地工作)。如果我能达到可以执行 GitVersion.GetVersion
任务的地步,那么我想我可以清楚地看到我想要的输出名称的方法。
有人成功了吗?或者任何人都可以就如何处理这个问题提供任何建议吗?
让我们看看这是否能解决您的问题
我的方法是这样的:
将以下内容添加到您的主程序集项目,而不是 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 文件进行版本控制。
我明白了。我一开始就走在正确的路线上。无需手动执行 GitVersion.GetVersion
,在 WiX 项目中安装 GitVersionTask
NuGet 包后,MSBuild 会正确处理此问题。它不起作用的原因是因为我在设置之前尝试使用 GitVersion 的属性。
因此,第一件事是创建一些属性来禁用一些不需要的 GitVersion
操作:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<WriteVersionInfoToBuildLog>false</WriteVersionInfoToBuildLog>
<GenerateGitVersionInformation>false</GenerateGitVersionInformation>
</PropertyGroup>
我们不能简单地更改 OutputName
属性 因为它是在任何任务(包括 GitVersion
任务)执行之前设置的,所以如果我们尝试使用 GitVersion
属性,它们将是 empty/unset 因为 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 属性对其进行扩充,以创建 TargetName
、TargetFileName
和 TargetPath
将在其余构建过程中使用的属性。这是有效的,因为 BeforeBuild
任务保证在生成任何输出文件之前执行,因此所有 Target* 属性都将在此之前设置。
我最近开始使用 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
我从 this answer, which references this blog post 找到了这个解决方案。 7.1.0.3
来自构建中主程序集的程序集版本,而后者又在其自己的构建期间由 GitVersion 进行版本控制。
不过,我真正喜欢的是使用 FullSemVer
属性,可以在这里看到:
C:\Users\Tim\source\repos\TA.DigitalDomeworks [release/7.1 ↑1 +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
构建任务已执行,之后我应该能够从名为 属性 的构建中获得完整的 SemVer =17=].
但是,我不确定如何在 WiX 项目中实现这一点,因为安装 GitVersionTask
NuGet 包似乎没有任何作用(在 C# 项目中,一切都神奇地工作)。如果我能达到可以执行 GitVersion.GetVersion
任务的地步,那么我想我可以清楚地看到我想要的输出名称的方法。
有人成功了吗?或者任何人都可以就如何处理这个问题提供任何建议吗?
让我们看看这是否能解决您的问题
我的方法是这样的:
将以下内容添加到您的主程序集项目,而不是 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 文件进行版本控制。
我明白了。我一开始就走在正确的路线上。无需手动执行 GitVersion.GetVersion
,在 WiX 项目中安装 GitVersionTask
NuGet 包后,MSBuild 会正确处理此问题。它不起作用的原因是因为我在设置之前尝试使用 GitVersion 的属性。
因此,第一件事是创建一些属性来禁用一些不需要的 GitVersion
操作:
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<WriteVersionInfoToBuildLog>false</WriteVersionInfoToBuildLog>
<GenerateGitVersionInformation>false</GenerateGitVersionInformation>
</PropertyGroup>
我们不能简单地更改 OutputName
属性 因为它是在任何任务(包括 GitVersion
任务)执行之前设置的,所以如果我们尝试使用 GitVersion
属性,它们将是 empty/unset 因为 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 属性对其进行扩充,以创建 TargetName
、TargetFileName
和 TargetPath
将在其余构建过程中使用的属性。这是有效的,因为 BeforeBuild
任务保证在生成任何输出文件之前执行,因此所有 Target* 属性都将在此之前设置。