我读过约翰罗宾斯的文章TFS 2010 Build Number and Assembly File Versions: Completely In Sync with Only MSBuild 4.0,我想知道如何整合这个文章。
该文章的下载有两个文件,一个是目标文件,另一个是proj文件。
目标文件有许多任务要根据Tfs内部版本号(与构建版本相同的内容)来删除内部版本号,并将该编号写入某个位置(称之为BuildNumberFile)以供其他项目使用文件。
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>
我有两个问题:
谢谢!
答案 0 :(得分:1)
我想我已经解决了这个问题,但有两个人提出了我的问题所以我会在这里回答:
您可以通过从另一个目标表达目标来确保目标的运行。 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的依赖性最后。
希望这有帮助!