Tfs2010 内部版本号和程序集文件版本以及 MSBuild 目标
-
27-09-2019 - |
题
我读过约翰·罗宾斯的文章 TFS 2010 内部版本号和程序集文件版本:仅与 MSBuild 4.0 完全同步, ,我想知道集成这个的最佳方法。
本文的下载有两个文件,一个是 Targets 文件,一个是 Proj 文件。
目标文件有许多任务,用于根据 Tfs 构建号(与构建使用的构建号相同)刮出构建号,并将该数字写入某个位置(称为 BuildNumberFile)以供其他 proj 文件使用。
proj 文件非常简单。它只是导入上述目标文件,然后声明一个名为“All”的目标,同时还将 Project 元素上的 DefaultTargets 声明为 All。
<Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
<TFSMajorBuildNumber>3</TFSMajorBuildNumber>
<TFSMinorBuildNumber>1</TFSMinorBuildNumber>
</PropertyGroup>
<Import Project="Wintellect.TFSBuildNumber.targets"/>
<!-- Just ask for the version information files you need. These are here to show all the diffent ones in
Wintellect.TFSBuildNumber.Targets. You can change the names -->
<Target Name="All"
DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
WriteSharedVBAssemblyVersionFile;
WriteSharedCPPCLIAssemblyVersionFile;
WriteSharedCPPAssemblyVersionFile;
WriteSharedWiXAssemblyVersionFile;
WriteSharedTextAssemblyVersionFile;"/>
</Project>
我对此有两个问题:
- 我仍在学习 MSBuild。如果目标的名称没有在目标中的其他地方指定,那么目标是否会被执行?如何确保该目标运行?
- csproj 文件是否应该为 BuildNumberFile 所在位置声明一个 Include 项,即使它在编译时才存在?
- ItemGroups 和 Include 是否有 DependsOnTargets 或允许它们在构建之前确保文件存在的东西?
- 使用此功能的 csproj 文件的全部内容是否应该包装在表示 BuildNumberFile 的 DependsOnTargets 的目标中?
谢谢!
解决方案
我想我已经弄清楚了,但是有两个人提出了我的问题,所以我会在这里回答:
您可以通过表达另一个目标对某个目标的依赖关系来确保该目标运行。Microsoft.Common.targets 公开两个目标(BeforeBuild 和 AfterBuild),明确用于重写以实现可定制性。我发现最简单的方法是
<Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" />
其中 WriteSharedCSharpAssemblyVersionFile 是在原始帖子中的链接下载中声明的目标。另外,如果您是 MSBuild 新手,则必须在导入 Microsoft.CSharp.targets 之后声明此 BeforeBuild 目标,但默认的 csproj 模板会指导您执行此操作。WriteSharedCSharpAssemblyVersionFile 目标确实应该将文件写入某个中心位置,因为在构建解决方案时,所有目标仅执行一次。所有项目都应该从该位置引用该文件,即使该文件不存在,因为在编译发生时(或更重要的是,在解析引用时),BeforeBuild 目标将已运行并且文件将就位。
- 在我的结构中,我将这些版本控制文件放在分支根文件夹正下方的文件夹中。此外,由于生成了正在构建的文件,因此我将其构建到输出目录。从输出中引用内容似乎有点奇怪,但它保留了将所有构建产品放在一个位置的不变性,以便可以将输出目录吹走作为执行清理的一种方法。
在 MSBuild 中,项目构成系统的输入(通常是文件),因此根据目标来考虑它们是很奇怪的。经过一番学习后,这个问题没有多大意义。无论如何,答案是否定的。
该文件的全部内容确实不应该全部包含在一个目标中 - 所需要做的就是在 csproj 文件的开头导入 Wintellect.TFSBuildNumber.targets 文件,并在末尾声明 BeforeBuild 对 WriteSharedCSharpAssemblyVersionFile 的依赖关系。
希望这可以帮助!