Visual Studio:随机构建订单?

时间:2015-04-27 15:08:38

标签: c# .net visual-studio-2013

我有一个包含239个项目的解决方案。我目前有以下问题:

当我对解决方案进行“全部重建”后,完成了全部清理(删除输出目录)后:

17>------ Rebuild All started: Project: AAA, Configuration: Debug x86 ------
18>------ Rebuild All started: Project: BBB, Configuration: Debug x86 ------
18>CSC : error CS0006: Metadata file 'E:\Dev\Trunk\Debug\x86\AAA.dll' could not be found
17>  XmsCommon -> E:\Dev\Trunk\Debug\x86\AAA.dll

我理解以下内容:

  • Visual Studio多线程编译(在我的情况下,一次4个汇编)
  • 我没有明确的“项目依赖关系”指定(右键点击解决方案 - >项目依赖关系)

我不明白

  • 在这个例子中,AAA是BBB的引用项目,对我来说,它是一个隐式依赖,如何在不确定AAA是否已正确构建的情况下正确构建BBB?
  • 我们应该如何管理239项目的解决方案?确保我们不对错误的项目进行任何引用是很困难的,因此如果我们始终必须确保构建订单,那么它就会变得复杂。

一个注意事项:我不知道这是否是由于最近的变化(项目/视觉工作室/ ......),因为我花了两年时间研究这个解决方案,这是第一次我一次又一次地接受了这个问题。

所以问题是:

  1. 有没有办法处理这个问题,而无需在解决方案上指出每个项目依赖关系?
  2. 如果没有,我们该怎么做?
  3. 修改 评论之后,这里有一些额外的信息:

    • AAA或BBB中没有编译错误,除了找不到引用
    • 我们引用项目而不是dll(在我遇到错误的一个特定情况下检查。

    BBB.csproj中,我有以下参考:

    <ProjectReference Include="..\..\..\..\SomeOtherFolder\AAA\AAA.csproj">
      <Project>{6241076B-05B3-4D5D-AFA9-46D41E1CEC3A}</Project>
      <Name>AAA</Name>
      <Private>False</Private>
    </ProjectReference>
    

    编辑2 我不知道这是否直接相关,但在检查项目依赖关系时,我发现BBB取决于CCC(但AAA没有任何内容。我想知道如果有依赖指定,它基本上忽略来自引用的所有信息?如果我尝试删除CCC依赖,我得到一条消息: This dependency was added by the project system and cannot be removed

    编辑3

    我做了一个非常有趣的发现:实际上我在编辑2中的错误是因为在两个项目之间创建引用时添加了这种依赖。

    由于未知原因,似乎尚未为此处的一个引用创建此依赖项。如果我删除项目引用,然后再次将引用添加到同一项目,我现在有这种依赖(我无法删除)。 我无法找到这种“依赖性存储的位置。 关于如何“修复”这个解决方案的任何想法?

4 个答案:

答案 0 :(得分:2)

从你的帖子中你说出来了 "I've no explicit "Project Dependency" specify(Right click on solution -> Project Dependencies)"这意味着所有引用都是针对编译的DLL,而不是项目。

我已经多次看到这种方法由拥有大型解决方案的团队(你有239个项目)完成,因为VS加载很多项目参考的速度很慢。

我见过的解决方法是:

  • 主要解决方案的每个子区域的多个解决方案,例如实体,DAL,逻辑,服务等。
  • 检入DLL(不推荐,但我已经看过)到Source中以用于更快的构建。更改代码区域后,您负责替换DLL。
  • 配置项目依赖项设置,以便按正确顺序完成构建。
  • 处理项目参考的性能(缓慢但确保构建顺序

一个包含239个项目的单一解决方案似乎违背了将开发划分为更小模块的原则,但这并不总是您的决定......

答案 1 :(得分:2)

经过一番调查,我发现了这个问题:

实际上,当将项目引用到项目中时,Visual Studio应该自动在项目之间添加这些依赖项。通过添加项目引用,我可以很容易地看到它。此外,似乎无法删除这些“依赖项”(请参阅​​我的编辑2)。

所以我问的问题是如何引用一些项目并且对某些项目没有依赖性?

我检查了我的参考文献(至少在某些情况下我看到它不起作用)并且它们是项目参考而不是dll。

我的一些同事,使用完全相同的代码(获取最新版本的代码而不进行更改)没有出现此问题,并且在Visual Studio中显示了依赖关系。

所以我最后删除了我的解决方案文件附近的*.sdf文件(在关闭了visual studio之后)。我重新打开了tadaa,所有依赖项都被visual studio重新计算了。现在我们重建,一切都是成功的。

我不确定它为什么会发生,我有时间杀死视觉工作室,也许有些事情已经腐败了。

答案 2 :(得分:0)

我在一个较小但高度相互依赖的解决方案中看到了这个问题。我们通过将并行项目构建的最大数量减少到可预测的成功来解决此问题。工具 - &gt;选项 - &gt;项目和解决方案 - &gt;建立并运行。

答案 3 :(得分:0)

我知道这不是一个解决方案,但您可以将编译依赖项转换为运行时依赖项,您可以使用依赖注入技术,如MEF或Unity。

在这种情况下,您的项目具有有限的依赖关系(Interfaces,Containers)。

但我不得不说,这些技术带来了一些副作用 - 比如“伪随机”初始化等......