MSBuild - 它可以解决解决方案文件中的项目依赖性吗?如果是这样的话?

时间:2008-11-13 16:23:56

标签: visual-studio msbuild

我有一个msbuild项目,它从visual studio构建一个SLN文件,它包含所有项目(大约70多个项目),并且很多项目彼此依赖,这意味着它们需要按顺序构建 - 有时候开发人员忘记在解决方案文件中在visual studio中手动设置构建顺序,导致清洁解决方案上的msbuild失败,因为某些内容无序构建/无法找到dll。

有没有办法让msbuild获取所有项目并计算出依赖项并按顺序构建项目,如果有这样做的话?使用MSBuild任务?使用当前尝试,它似乎只是按照它读取项目的顺序构建 - 如果我传入项目文件列表+路径。

目前我能想到解决这个问题的唯一方法是外部应用程序扫描proj文件和引用,然后每次手动创建一个解决方案..但这对于这么简单的事情来说似乎有点过头了。

之前有人解决/看过这个吗?

7 个答案:

答案 0 :(得分:4)

你是如何打电话给MSBuild的?如果将MSBuild指向解决方案文件,它应该能够计算出依赖关系。如果将其指向单个项目文件,则无法解析任何项目引用。

如果您不使用项目引用,您仍然可以使用“项目依赖项”对话框来手动设置依赖项来控制解决方案中的依赖项顺序。

答案 1 :(得分:4)

虽然很难维护项目依赖关系并且不能在.sln文件之间共享,但项目参考文献会受到尊重,并且会一致地指示订单 - 请参阅ResolveReferences中的Microsoft.Common.targets任务

ASIDE:“我的朋友”可能“在重构过程中”意外删除了他们的构建Task以及与DependsOnTargets Microsoft.Common.targets任务的ResolveReferences链接结果ProjectReferences没有被尊重,听起来像这里的问题。如果你read some of the posts,你可能会认为这一切都是疯狂的 - 它不是;不稳定的位是Project 依赖项,而不是Project 引用


请参阅this excellent MSDN Blog article by Dan Moseley,它真正解释了该主题,包括一些有用的解决方法策略。 (通过this mildly related issue with building xUnit.net)。

答案 2 :(得分:1)

如果所有依赖项目都在解决方案中并且您正在使用Project引用,则Visual Studio应按照该依赖项列表的顺序管理您的依赖项并构建。

听起来你没有使用项目参考。我总是推荐项目参考。

答案 3 :(得分:1)

这是一个老问题,但问题很可能是解决方案中的项目使用直接引用依赖DLL(添加引用>选择浏览选项卡>选择依赖DLL)而不是使用项目引用(添加引用>选择“项目”选项卡>选择依赖项目)。通过直接引用,Visual Studio无法找出依赖关系链。您必须通过右键单击解决方案节点并选择“属性”来告诉它。选择公共属性>项目依赖项以设置所需项目。克劳斯先生是对的,但我想记录如何解决这个问题。

答案 4 :(得分:0)

虽然MSBuild在使用项目依赖项时应遵守构建顺序是正确的,但有一点需要注意。在构建干净的目标时,它目前没有观察到反向构建顺序(正如我在博客中提到的here)。对于常规构建,它可以很好地工作,如其他人所描述的那样。

答案 5 :(得分:0)

我正在使用在c:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe中找到的Msbuild 4 它似乎解决了这个问题。

答案 6 :(得分:0)

没有Microsoft工具可以检查70多个项目的所有依赖项,并生成一个解决方案文件,其中包含明确声明的依赖项。

您必须使用两种不同的方法自行完成:

  1. 在visual studio中为解决方案手动指定依赖项。
  2. 在项目文件中指定项目引用。
  3. 如果您不想这样做,那么您将不得不吞下药物并接受您将使用外部工具为您做到这一点。是的,它很笨重,但它可以起作用。如果您将解决方案文件签入源代码管理,则可以缓解这些问题。只要您有一个可以使用的活动解决方案文件。

    我一度都没有,我在构建中有600多个项目。所以我写了一个工具(多年前),它将自动完成99%的工作。它使用.NET MSBuild API来读取msbuild文件(这里没有使用xml api重新创建轮子)。然后它检查输出和输入并生成一个依赖树,然后我可以用它做一些事情:

    1. 吐出解决方案文件。
    2. 进行依赖性排序(也是学术界的拓扑排序),然后吐出这些项目以便构建它们(对于非并行类型的构建,有时可能很有用)。
    3. 打印出有关依赖关系的各种诊断信息。
    4. 我用这个工具看到的唯一限制是有一些疯狂的COM依赖,无论如何都是相当粗略的。我添加了一个超级简单的解决方法。

相关问题