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

Tsh*_*err 6 versioning msbuild tfs tfsbuild

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

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

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

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

我正在寻找两件事之一:

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

要么

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

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

谢谢你的时间!

Giu*_*ian 2

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

  1. 您必须使用增量构建,即 Clean Workspace = None
  2. 必须在每个项目中计算对 AssemblyInfo.cs 的更改

后者是最复杂的,我将在这里起草解决方案。

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

/property:CustomAfterMicrosoftCommonTargets=custom.proj
Run Code Online (Sandbox Code Playgroud)

同时转发版本值

/property:BuildNumber=1.2.3.4
Run Code Online (Sandbox Code Playgroud)

在 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>
Run Code Online (Sandbox Code Playgroud)

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

我在我的博客上发布了完整的详细信息:这里这里这里