6

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

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

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

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

我正在寻找两件事之一:

  • 一种仅在其源/依赖项自上次构建后发生更改时才增加程序集版本号的方法。连续的 Build-All 不应导致版本号发生变化。

或者

  • 一种让测试人员和非开发人员能够区分程序集 'Foo' 的版本 WXYZ 和版本 WXYZ+1 相同的方法,即使它们具有不同的文件版本。

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

谢谢你的时间!

4

1 回答 1

2

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

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

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

在自定义 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 扩展包为此目的有一个 AssemblyInfo 任务。

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

于 2014-03-17T21:00:19.180 回答