【问题标题】:Force TFS buildserver to compile csproj files in a specific order强制 TFS buildserver 以特定顺序编译 csproj 文件
【发布时间】:2014-07-21 16:56:35
【问题描述】:

应用来自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.csprojc_40.csproj。其中一些项目依赖于解决方案中的另一个项目。例如b*.csproj 依赖于a*.csproj。还有a.csproja_40.csproj的输出库同名:a.dll

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

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

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

问题:我不知道该怎么做。

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

【问题讨论】:

  • 疯狂的是拥有多个版本的项目。尝试更改构建定义以在每个解决方案中使用单独的输出文件夹?
  • 呃我已经这样做了? @约翰桑德斯
  • 每个解决方案一个输出文件夹?通常整个构建都会有一个输出。
  • @JohnSaunders 在 TFS 的构建管理器中有一个设置,您可以在其中更改它。遗憾的是,它仅适用于解决方案,不适用于 csproj 文件。
  • 这就是我在评论中使用“解决方案”一词的原因。如果每个解决方案都是一个版本,并且每个解决方案使用一个文件夹,也许这会解决您的问题。

标签: c# .net build


【解决方案1】:

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

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

【讨论】:

  • 你也可以在一个 Build Definition 中添加两个配置,每个配置都会输出到自己的输出文件夹。尽管下拉列表仅显示标准配置,但您也可以在此处输入手动配置。每个配置都应该放在它自己的子文件夹中。见:msdn.microsoft.com/en-us/library/dd647547.aspx#configs
【解决方案2】:

我不使用 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 中编译内容。

【讨论】:

  • 所以您的建议是将 .sln 放在一边,将所有 .csproj 文件直接链接到 TFS 构建服务并手动为 MSBuild 命令提供参数?
  • 虽然其他构建工具也很棒,但它们不是解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多