我的任务是在我的公司建立一个新的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之间没有提交任何内容,则版本将不会增加。但是,这意味着更改和提交单个文件会强制所有程序集的版本增量。
我正在寻找两件事之一:
OR
我可能已经阅读了大约20篇关于这个主题的文章,没有人(除了this guy)似乎解决了这个问题。如果我要求的不是Team Foundation ALM中的常见做法,我该如何解决上面的第二个要点?
谢谢你的时间!
答案 0 :(得分:2)
这是我过去所做的。该解决方案有两个关键点:
后者是最复杂的,我将在这里草拟解决方案。
在自定义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任务。