从csproj文件构建依赖关系树

时间:2008-12-10 14:51:55

标签: c# optimization msbuild

我目前正在使用msbuild来解决600多个项目。

想象一下,我更改了10个项目使用的1个库的代码。而不是将所有600个项目提供给msbuild,让它编译所有这些项目并找出依赖项。我想知道是否有一个程序或库我可以使用它来分析所有600个项目的依赖项,并允许我只编译必要的11个。

换句话说,考虑到要扫描的所有600个项目的输入,以及作为已修改参数的项目的BaseLibrary.csproj,仅提供我需要编译为输出的11个项目。

我在编写自定义任务方面经验丰富,我只想使用第三方库进行依赖性分析,如果已经存在一个。

我公司每3-4个月对生产进行一次增量发布。作为一个实验,我编写了一个自定义任务,查看以前版本的“Subversion标记”,并评估自那时以来已更改的所有已编译文件,并将它们映射到项目。

我能想到的唯一不起作用的用例是我提到的一个基础库被更改的系统并且系统不知道所有依赖它的项目。

4 个答案:

答案 0 :(得分:4)

你试过.NET assembly dependency analyser吗?

它是开源的,dot script中的图表输出可能就是您所需要的。该网站的一个例子:

digraph G { 
      size="100,69"
      center=""
      ratio=All
      node[width=.25,hight=.375,fontsize=12,color=lightblue2,style=filled]
      1 -> 9;
      1 -> 11;
      9 -> 10;
      11 -> 10;
      1 [label="Drew.Controls.Map"];
      9 [label="Drew.Types"];
      10 [label="nunit.framework"];
      11 [label="Drew.Util"];
 } 

使用项目列表和此脚本输出,您可以创建编译列表。

答案 1 :(得分:2)

我有一些代码可以做到这一点;我在我们的定制构建过程中使用它来:找出构建顺序(无需维护它),以及b:级联通过随机项目树向上更改。不幸的是,我现在不在我平常的办公室里,代码太复杂了,无法重现“关闭袖口”(它会进行大量的图形映射和依赖性跟踪)。

我应该补充一点,它目前的工作原理是在每个项目的根目录中有一个自定义标记(xml文件)来跟踪需要构建的内容;我们的代码提升过程设置了标志,构建过程将清除它。

目前它的工作方式是你到达包含所有项目的根(在任何深度),只需键入depends(带几个开关),它就会发出所有项目路径需要按正确的顺序建设。

让我知道它是否有意义......

答案 2 :(得分:1)

项目依赖关系是一个图形,如果P依赖于Q,则项目P具有项目Q的有向边缘。这意味着Q必须在P之前构建。

一般来说,图表的拓扑排序会显示整个图形的依赖顺序,但是您只对从P到图形根的图形(或根,如果有更多)感兴趣。

此图中的根是项目,它不依赖于任何其他项目,但其他项目依赖于该项目。

当您更改P时,将以相反的顺序(根首先)编译从P到您正在运行的根的所有项目。最简单的方法是创建该路径的子图(带子节点)并使用拓扑排序来确定正确的顺序。

也就是说,这是一个复杂的问题,因为更改项目中的代码必须以某种方式将该项目标记为“已更改”,并且您还需要手动解析项目文件中的依赖项。

如果我没弄错的话,MSBuild只编译过时的项目。 (虽然确实处理它们但必须处理,否则无法确定哪个项目“已更改”)。

答案 3 :(得分:0)

MSBuild Tasks没有你想要的东西,但它会给你一个简单的入口点来编写你自己的任务。