3

我阅读了 John Robbins 的文章TFS 2010 Build Number and Assembly File Versions: Completely In Sync with Only MSBuild 4.0,我想知道如何进行集成。

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

谢谢!

4

1 回答 1

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 的依赖。

希望这可以帮助!

于 2010-10-03T04:51:28.890 回答