强制TFS构建服务器以特定顺序编译csproj文件

时间:2014-07-18 14:57:23

标签: c# .net build tfs2012

this answer应用建议的更改后,我的构建服务器无法构建受影响的解决方案。

问题是.NET 4.0和.NET 4.5项目是在彼此之后编译的。

作为一个例子,假设我有4个项目:a.csprojb.csprojc.csproj。所有项目都有.NET 4.0和.NET 4.5版本,这意味着我a.csproja_40.csprojb.csprojb_40.csprojc.csproj和{ {1}}。其中一些项目依赖于解决方案中的另一个项目。例如,c_40.csproj取决于b*.csproj。此外,a*.csproja.csproj的输出库名称相同:a_40.csproj

现在,不是采取理智的方式并编译所有4.0程序集,然后编译所有4.5程序集,TFS像往常一样,选择疯狂的方式并以完全随机的顺序构建所有内容,同时为所有项目使用相同的输出文件夹。当然失败了。

我想这个问题至少有两个解决方案:

  1. 不是将所有内容都放在同一个build文件夹中,而是为每个项目使用一个文件夹,或者每个.NET版本至少使用一个文件夹。 (正如Visual Studio所做的那样)
  2. 强制TFS按特定顺序构建项目(例如,首先是所有.NET 4.0程序集)。
  3. 问题:我不知道该怎么做。

    我的问题:有人可以告诉我如何使我的两个建议的解决方案中的任何一个工作向我展示这个问题的另一个解决方案吗?

2 个答案:

答案 0 :(得分:1)

找到解决方案:https://stackoverflow.com/a/1027551/937093

通过向所有受影响的解决方案添加两个构建配置(一个用于构建.NET 4项目,一个用于构建.NET 4.5项目)并在TFS中创建两个构建定义,我得到的东西就像我想要的那样。

答案 1 :(得分:-1)

我没有使用TFS作为构建机器(我更喜欢Jenkins或其他CI工具),但所有服务器都允许您创建自己的MSBuild脚本来进行构建。 .csproj是一个MSBuild脚本。

如果您创建自己的脚本,则可以设置首选订单。无论如何,使用.sln通常可以正确地解决依赖关系。

如果您想深入了解MSBuild,请查看参考资料:http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx

示例脚本如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
<PropertyGroup>
    <TextToSay>This is a property</TextToSay>   
</PropertyGroup>

<ItemGroup>
    <Binaries Include="$(MSBuildProjectDirectory)\..\MSBuildTests\**\*.dll" />
</ItemGroup>

<UsingTask TaskName="GenerateDumbFiles" AssemblyFile="$(MSBuildProjectDirectory)\..\MSBuildTests\MSBuildTests.Tasks\bin\Debug\MSBuildTests.Tasks.dll" />

<Target Name="SaySomething">
    <Message Text="$(TextToSay)" />
</Target>

<Target Name="Build">
    <Delete Files="@(Binaries)" />
    <MSBuild Projects="$(MSBuildProjectDirectory)\..\MSBuildTests\MSBuildTests.sln" />
    <MakeDir Directories="$(MSBuildProjectDirectory)\..\dumbfiles" />
    <GenerateDumbFiles Directory="$(MSBuildProjectDirectory)\..\dumbfiles" Prefix="DumbFile" Count="100" />
</Target>

<Target Name="TransformLog">
    <XslTransformation XmlInputPaths="$(MSBuildProjectDirectory)\msbuild-output.xml" XslInputPath="$(MSBuildProjectDirectory)\msbuild.xsl" OutputPaths="$(MSBuildProjectDirectory)\log.html" />
</Target>

MSBuild任务用于编译.NET中的东西。