Tfs2010内部版本号和汇编文件版本& MSBuild目标

时间:2010-10-02 04:22:14

标签: msbuild build-process versioning csproj msbuild-4.0

我读过约翰罗宾斯的文章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>

我有两个问题:

  • 我还在学习MSBuild。如果目标的名称未在目标中的其他位置指定,则目标是否已执行?如何确保运行此目标?
  • csproj文件是否应该为BuildNumberFile所在的位置声明一个Include项,即使它在编译时才存在?
  • ItemGroups和Include是否有DependsOnTargets或允许他们在构建之前确保文件存在的东西?
  • csproj文件的全部内容是否应该包含在表示DependsOnTargets for BuildNumberFile的目标中?

谢谢!

1 个答案:

答案 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的依赖性最后。

希望这有帮助!