9

我正在为我们的团队建立一个构建服务器。

背景
我们正在使用 Microsoft Visual Studio 2010 Ultimate。我们的产品包含 C# 代码(主要)、外部 DLL 和 C 代码。我们正在使用 .Net 4.0 并拥有 70 多个项目。

我们正在使用我们代码的 3 个分支:

  • 生产分支(当前发布的内容)
  • 测试分支(热修复、错误修复、最终用户测试)
  • 开发分支(添加新功能)

所有分支都在 TF 源代码控制之下。

目标
我们想要的是有一个构建服务器来构建和运行所有分支的所有单元测试,每天一次,构建服务器应该使用源代码控制中的代码。我们的目标是进行一些快速的标准错误检测。我们宁愿少维护构建服务器。

我们不会使用 buildserver 生成的构建,我们只想使用构建服务器来持续构建和单元测试我们的分支。

设置内容
目前设置了两个构建定义,一个用于测试分支,一个用于开发分支,两个构建定义都从源代码管理中获取代码(这部分工作正常),但这里是有趣的地方开始。

问题
Test Branche 可以很好地构建和运行单元测试。

由于(或类似 5 个)错误,开发分支无法构建:

The type or namespace name 'XXX' does not exist in the namespace 'YYY' (are you missing an assembly reference?)

错误是项目 X 引用项目 Y。项目 X 和 Y 都是 C# .Net 4.0 项目,我们可以完全控制它们,X 和 Y 都编译为 DLL。项目 Y 包含项目 X 中的类正在实现的接口。

烦人的细节是项目 X 或 Y 的测试分支和开发分支没有区别。这两个项目在过去 3 个月中完全相同。

所以问题是,为什么它在测试分支中起作用,而在开发分支中不起作用?

我已经测试过:
- 项目被正确地相互引用。- 在我自己/我的任何同事开发机器上构建所有 3 个分支都没有问题(我们已经在 5 台不同的机器上进行了测试)。- 我试图删除整个 X 项目并重新创建它,但没有成功。- 我试图删除整个 Y 项目并重新创建它,但没有成功。- 我试图更改项目 X 项目及其类的命名空间,但没有成功。- 我试图更改项目 Y 项目及其类的命名空间,但没有成功。- (我什至重新启动了我的开发机器) - 在构建服务器设置为构建之后,所有更改都始终检查到源代码管理中。

额外信息
我一直在日志文件中挖掘,发现了一些有趣的细节,这是在开发分支中构建项目 X 的​​细节

Task "AssignProjectConfiguration"
  Project reference "..\..\A" has been assigned the "Debug|x86" configuration.
  Project reference "..\..\Y" has been assigned the "Debug|x86" configuration. (can see there is a project Y)
  Project reference "..\..\B" has been assigned the "Debug|x86" configuration.  

但随后在任务“ResolveAssemblyReference”中

Task "ResolveAssemblyReference"
  TargetFrameworkMoniker:
      .NETFramework,Version=v4.0
  TargetFrameworkMonikerDisplayName:
      .NET Framework 4
  TargetedRuntimeVersion:
      v4.0.30319
  Assemblies:
      System
      System.Xml.Linq
      System.Data.DataSetExtensions
      Microsoft.CSharp
      System.Data
      System.Xml
      System.Core
  AssemblyFiles:
      C:\Builds\1\A
      C:\Builds\1\B
(----- Missing project Y -----)
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll

在同一任务的测试分支中的哪个位置

Task "ResolveAssemblyReference"
  TargetFrameworkMoniker:
      .NETFramework,Version=v4.0
  TargetFrameworkMonikerDisplayName:
      .NET Framework 4
  TargetedRuntimeVersion:
      v4.0.30319
  Assemblies:
      System
      System.Data.Entity
      System.Xml.Linq
      System.Data.DataSetExtensions
      Microsoft.CSharp
      System.Data
      System.Xml
      System.Core
  AssemblyFiles:
      C:\Builds\1\A
      C:\Builds\1\B
      C:\Builds\1\Y (There it is)
     C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll

所以感觉就像它出于某种原因只是“忘记”了从项目 X 到项目 Y 的引用。

帮助

4

6 回答 6

6

我有同样的问题。

我花了几个小时才发现在这种情况下问题不是我的错:-)

http://support.microsoft.com/kb/2516078

出现此问题的原因是 .NET Framework 库中的 Path.GetFullPath 中的错误。这是 Visual Studio 2010 中的一个已知问题

症状:

...当您尝试使用多个项目构建解决方案时,它们之间存在依赖关系,在特定条件下构建失败并显示以下错误消息。

错误消息:“C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets (1200, 9):警告:引用的项目‘当前目录中引用的项目的相对路径’不存在。”</p>

当满足以下条件时,构建将失败并显示上述错误消息。

  1. 您有一个包含多个项目的解决方案,这些项目之间存在依赖关系。
  2. 以下两个路径长度之和正好相加到 259 个字符 (= MAX_PATH – 1)

1) 引用项目目录的路径。2) 从当前目录到引用项目的相对路径(= 引用项目的目录)。

注意:MAX_PATH 是 Windows API 定义的最大路径长度,设置为 260 个字符。

解决方法:

要解决此问题,您可以更改路径长度并确保以下两个路径长度的总和不超过 259 个字符。

  1. 引用项目目录的路径。

  2. 从当前目录到引用项目的相对路径(= 引用项目的目录)。

于 2012-09-10T15:41:22.680 回答
2

我最近遇到了同样的错误。在 VS2010 本地构建的解决方案很好,但在构建服务器上始终失败。最后,MSBuild 定义设置为Release x86配置,但抱怨的项目引用了bin\x86\Debug中的程序集,而不是bin\x86\Release

验证引用了程序集的发布版本而不是调试版本(并根据需要进行更正)似乎对我有用。

于 2012-12-04T18:56:05.063 回答
1

不幸的是,我的问题完全不同。

我正在构建相同公共代码的两个不同版本,一个用于 .Net4,另一个用于 Silverlight 5,具有相同的文件名 (.Framework.dll)。

由于默认情况下构建服务器将所有内容输出到同一文件夹,因此程序集的 Silverlight 版本最终覆盖了 .Net4 版本,因为 msbuild 决定稍后构建它。一旦构建解决方案中的下一个项目,这就会导致一个问题,该项目依赖于 .Net4 版本的 dll 上可用的某些类,但不依赖于 Silverlight 版本。

我最终将项目拆分为多个解决方案,并在构建定义“流程”选项卡上将“解决方案特定构建输出”选项设置为 true。

于 2013-07-22T21:26:35.573 回答
1

我有一个非常相似的问题。我发现在配置管理器中,在发布配置下,平台设置为任何 CPU 并且构建复选框没有选中。

将平台设置为 x86(因为我的所有其他项目出于遗留原因都设置为此)并确保在此配置下将项目设置为 Build 解决了我的问题。

于 2013-12-09T03:20:28.127 回答
0

我刚刚遇到了类似的问题,最后是最后一次处理代码的开发人员决定在 obj\debug 目录中添加对某些 dll 的引用。

于 2013-07-16T19:24:51.370 回答
0

这是一个有点老的问题,但我刚刚遇到了类似的问题,在我的情况下,它是失败的项目(项目 A)的 .cproj 文件中错误引用的项目 ID(我们称之为 B)。最初,我从另一个解决方案中复制了项目 A,并将其包含在我现在正在使用的解决方案中。引用的项目 B 也出现在两个解决方案中,因此 Visual Studio 自动解析引用,即使在 A 的 .cproj 引用的项目 B 仍然指向我复制它的解决方案中的 B:

<ProjectReference Include="..\B.csproj">
  <Project>{F3006530-D421-4A89-AA8B-376DBAA31E03}</Project> - wrong Id!
  <Name>ProjectB</Name>
</ProjectReference>

奇怪的是,Visual Studio 会忽略不正确的 Id 并且可能只使用路径,因此没有构建错误并且正确的 dll 会出现在项目 A 的 bin 中。不过,我的构建服务器上的 MSBuild 不会那么自由。要修复它,您可以在文本编辑器中编辑 .cproj 文件,或者简单地删除引用并将它们添加回来,确保它们在您当前的解决方案中。

于 2016-04-18T09:20:54.470 回答