使用Team Foundation Server 2012自动进行版本控制;仅在更改的装配上增加

时间:2013-06-25 18:22:12

标签: tfs msbuild versioning tfsbuild

我的任务是在我的公司建立一个新的Team Foundation / Build服务器,我们将开始一个新的项目。目前没有人有TFS的经验,所以我自己学习所有这些。到目前为止一切都在发挥作用;服务器已经建立,Repository和Team Project已经创建,Build Server已经创建,我创建了一个简单的hello world应用程序来验证源代码控制和持续集成构建(在构建服务器上)正常运行。

但是,我在设置自动版本控制时遇到问题。我安装了TfsVersioning project,它运行正常;我能够为我的汇编版本定义一种格式。我还没有确定我将使用什么格式;可能是像Major.Minor.Changeset.Revision(我知道在程序集版本中使用变更集编号的潜在问题,所以我可能决定在开始开发之前切换到Major.Minor.Julian.Revision。) / p>

问题: 如果程序集源代码自上次构建以来没有更改,我不希望程序集具有新的文件版本。通过持续集成构建,这不是问题,因为构建服务器将只获取已更改的源文件,从而导致仅生成更新模块的增量构建;将不会构建现有的未更改的模块,因此它们的版本将保持不变。 如果我设置每晚构建,我将要清理工作区并执行Build-All。但是,这意味着所有程序集都将具有新版本(假设程序集文件版本包含内部版本号)。

解决方案? 这促使我考虑使用程序集文件版本中的最新变更集编号。这样,如果两个连续的Build-All之间没有提交任何内容,则版本将不会增加。但是,这意味着更改和提交单个文件会强制所有程序集的版本增量。

我正在寻找两件事之一:

  • 如果自上次构建后其源/依赖项已更改,则仅增加程序集版本号的方法。连续Build-Alls不应导致版本号的更改。

OR

  • 测试人员和非开发人员能够告诉版本WXYZ并且程序集'Foo'的版本WXYZ + 1的方法是相同的,即使它们具有不同的文件版本。

我可能已经阅读了大约20篇关于这个主题的文章,没有人(除了this guy)似乎解决了这个问题。如果我要求的不是Team Foundation ALM中的常见做法,我该如何解决上面的第二个要点?

谢谢你的时间!

1 个答案:

答案 0 :(得分:2)

这是我过去所做的。该解决方案有两个关键点:

  1. 您必须使用增量版本,即Clean Workspace = None
  2. 必须在每个项目中计算对AssemblyInfo.cs的更改
  3. 后者是最复杂的,我将在这里草拟解决方案。

    在自定义MSBuild属性中,使用CustomAfterMicrosoftCommonTargets在正常的Visual Studio编译中注入一个钩子

    /property:CustomAfterMicrosoftCommonTargets=custom.proj
    

    还转发版本

    的值
    /property:BuildNumber=1.2.3.4
    

    在custom.proj中,将目标BeforeCompile重新定义为类似的东西

    <Target Name="BeforeCompile"
    Inputs="$(MSBuildAllProjects);
            @(Compile);                               
            @(_CoreCompileResourceInputs);
            $(ApplicationIcon);
            $(AssemblyOriginatorKeyFile);
            @(ReferencePath);
            @(CompiledLicenseFile);
            @(EmbeddedDocumentation); 
            $(Win32Resource);
            $(Win32Manifest);
            @(CustomAdditionalCompileInputs)"
    Outputs="@(DocFileItem);
             @(IntermediateAssembly);
             @(_DebugSymbolsIntermediatePath);                 
             $(NonExistentFile);
             @(CustomAdditionalCompileOutputs)" 
    Condition="'$(BuildNumber)'!=''">
    
    <Message Text="*TRACE* BuildNumber: $(BuildNumber)"/>
    
    <MyTasksThatReplaceAssemblyVersion
        BuildNumber="$(BuildNumber)"
        File="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"/>
    </Target>
    

    您需要有一个任务来替换AssemblyInfo.cs源中的AssemblyFileVersion。 MSBuild Extension Pack为此目的有一个AssemblyInfo任务。

    我在我的博客hereherehere上发布了完整的详细信息。