2010-10-02 63 views
3

我阅读John Robbins的文章TFS 2010 Build Number and Assembly File Versions: Completely In Sync with Only MSBuild 4.0,我想知道如何整合这一点。Tfs2010内部版本号和汇编文件版本和MSBuild目标

该文章的下载有两个文件,一个是目标文件,另一个是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文件的全部内容是否应该包含在表示DependencyOnTargets的BuildNumberFile的目标中?

谢谢!

回答

1

我觉得我有这个想通了,但两个人提拔我的问题,所以我会在这里回答这个问题:

  • 可以确保从表达上的依赖,一个目标运行另一个目标。 Microsoft.Common.targets公开了两个目标 - BeforeBuild和AfterBuild - 明确是为了被覆盖以实现可定制性。我发现最简单的方法是<Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" />,其中WriteSharedCSharpAssemblyVersionFile是从原始帖子的链接下载声明的目标。此外,如果您是MSBuild的新手,则必须在导入Microsoft.CSharp.targets后声明此BeforeBuild目标,但默认的csproj模板将指导您执行此操作。

  • WriteSharedCSharpAssemblyVersionFile目标确实应该将文件写入某个中央位置,因为在构建解决方案时,所有目标都只执行一次。所有项目都应引用来自该位置的文件,即使该文件不存在,因为在编译时(或者更重要的是,在引用被解析的时候),BeforeBuild目标将会运行并且文件将到位。

    • 在我的结构中,我将这些版本控制文件放在分支根文件夹正下方的文件夹中。此外,由于正在生成的文件已生成,因此我将其构建到输出目录。从输出中引用东西似乎有点奇怪,但它保留了将所有产品都集中在一个地方的不变性,以便输出目录可以作为执行清理的手段而被吹走。
  • 在MSBuild项目构成输入到系统(通常是文件),所以它是奇怪的,根据目标的想法。经过一番学习后,这个问题没有多大意义。无论如何,答案是否定的。

  • 文件的全部内容应该确实不都在一个目标 - 所有需要的是导入Wintellect.TFSBuildNumber.targets在您的csproj文件的开头文件,并宣布BeforeBuild对WriteSharedCSharpAssemblyVersionFile依存性结束。

希望这有助于!