MSBuild - 它能够在解决方案文件中找出项目依赖关系吗?如果可以,如何实现?

21

我有一个msbuild项目,它从Visual Studio中构建一个包含所有项目的SLN文件(大约70个以上),而且很多项目彼此依赖,这意味着它们需要按顺序构建 - 有时开发人员会忘记在Visual Studio解决方案文件中手动设置构建顺序,导致在干净的解决方案上进行msbuild时失败,因为某些内容已按错误顺序构建或找不到某些dll。

是否有一种方法让msbuild获取所有项目并计算出它们的依赖关系,并按顺序构建项目?如果可以,请问该如何实现?使用MSBuild任务吗?通过当前尝试,它似乎只是按读取项目的顺序构建 - 如果我传递项目文件+路径列表。

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

有没有人解决/看到过这个问题?


你能详细说明一下你所说的开发人员在VS中不手动设置构建顺序的含义吗? - Mr. Kraus
这是你的问题吗?它目前给我带来了麻烦。http://social.msdn.microsoft.com/Forums/en/msbuild/thread/80cc6447-b720-4806-8395-7c257b207613?prof=required 似乎没有一个很好的解决方案。我认为我们将编写一个工具来解析.sln文件,查找引用的.csproj文件中的<ProjectReference>标记,并将该信息复制回.sln文件。 - Scott Langham
7个回答

5
虽然项目依赖关系难以维护且不在.sln文件之间共享,但项目引用得到了尊重并且能够一致地指定顺序——请参见Microsoft.Common.targets中的ResolveReferences任务。
顺带一提:我的一个朋友可能在重构期间意外删除了其生成任务及其与Microsoft.Common.targets中的ResolveReferences任务的DependsOnTargets链接,导致ProjectReferences未能按照此处所述的方式得到尊重。如果您阅读一些帖子,您可能会认为这很不稳定——事实并非如此;不稳定的是项目依赖关系,而不是项目引用。

请查看这篇优秀的MSDN博客文章,作者是Dan Moseley,它详细解释了这个主题,包括一些有用的解决策略。(通过与构建xUnit.net有关的这个问题)


4
你是如何调用MSBuild的?如果你将MSBuild指向解决方案文件,它应该能够解决依赖关系。如果你将其指向单个项目文件,则无法解决任何项目引用。
如果你不使用项目引用,仍然可以通过使用“项目依赖项”对话框手动设置依赖项来控制解决方案中的依赖顺序。

1
如果您的所有依赖项目都在解决方案中,并且正在使用项目引用,Visual Studio 应该会管理这些依赖关系并按照依赖关系列表的顺序进行构建。
听起来您没有使用项目引用。我总是推荐使用项目引用。

1

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


0

没有微软工具可以检查您的70多个项目的所有依赖项,并为您生成一个明确声明依赖关系的解决方案文件。

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

  1. 在Visual Studio中手动指定解决方案的依赖项。
  2. 在项目文件本身中指定项目引用。

如果您不想这样做,那么您将不得不接受使用外部工具来为您完成这项工作。是的,它有点笨重,但它可以被制作成可行的。如果您将解决方案文件检入源代码控制,则可以缓解这些问题。只要您有一个活动的解决方案文件即可。

我曾经有一次没有,而我在构建中有600多个项目。因此,我编写了一个工具(几年前)来自动化99%的工作。它使用.NET MSBuild API读取msbuild文件(不需要重新创建xml api的轮子)。然后,它检查输出和输入并生成一个依赖树,我可以对其进行一些操作:

  1. 生成解决方案文件。
  2. 进行依赖项排序(在学术界也称为拓扑排序)并按应构建的顺序输出这些项目(对于一种非并行类型的构建,有时可能很有用)。
  3. 打印出所有关于依赖项的诊断信息。

我见过这个工具唯一的限制是它在一些疯狂的 COM 依赖项上存在问题,这些依赖项本身就不太可靠。我添加了一个超级简单的解决方法。


0

我正在使用位于c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe的Msbuild 4,它似乎解决了问题。


0
虽然使用项目依赖项时,MSBuild 应该遵守构建顺序,但是有一个例外。目前,在构建“clean”目标时,它不会观察反向构建顺序(正如我在这里中所述)。然而对于常规的构建,它按照其他人在这里描述的那样工作得很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接