代码之家  ›  专栏  ›  技术社区  ›  LA.27

从MSBuild获取所有直接和间接项目依赖项的列表

  •  0
  • LA.27  · 技术社区  · 5 年前

    背景

    我有一个巨大的应用程序,它被分成几十个(百分之一?)小型C项目。为了构建它,我简单地调用

    msbuild my_root_project.csproj
    

    因为根项目只是导入所有必需的子项目(可以导入其他子项目,也可以导入其他子项目,…)。 当MSBuild遍历所有依赖项并逐个构建它们时,这种方法可以很好地工作。结果,我在构建输出文件夹(例如Debug)中得到了一堆dll。

    附加信息

    root
    |-> src
        |-> CsProject1
        |-> CsProject2
        ....
        |-> YetAnotherCsProject
        ....
        |-> MyRootProject
        ....
    |-> ext_libs
        |-> Newtonsoft.Json 
            |-> ... dlls
        |-> SevenZip (same here)
            |-> ... dlls
        |->  ...
    

    这些外部二进制文件可以在任何csproject中引用。此外,甚至有可能同一个库被我的根项目使用的几个子项目导入(例如,许多子项目使用Newtonsoft.Json).

    问题

    我需要从ext-libs文件夹中获得所有库的精确列表,这些库要么由我的根项目使用,要么由它的任何依赖项目使用。

    我查看了MSBuild输出日志,注意到它提供了如下消息:

    Building project XYZ.csproj /reference:ext_libs/lib1.dll /reference:ext_libs/lib2.dll ...
    ...
    ...
    Building project ABC.csproj /reference:ext_libs/lib5.dll /reference:ext_libs/lib23.dll
    ...
    

    由于MSBuild证明能够遍历所有依赖项并逐一解析所有依赖项。我想知道是否可以指示它做一些事情,比如:

    msbuild /dontBuild /listReferences
    

    或者,我可以手动遍历所有csproj文件,但显然我更喜欢使用现有工具,而不是创建自定义工具。

    • 由于某些原因,我不能只检查输出文件夹的内容,所以这不是一个选项。
    • 最好是.NET4,但如果问题可以在框架的最新版本中轻松解决。。。很高兴听到答案:)。
    0 回复  |  直到 5 年前
        1
  •  1
  •   C.J.    5 年前

    我写了一个工具来帮助这种情况。 https://github.com/chris1248/SolutionBuilder
    将它指向一个目录,它将为您生成一个包含所有.csproj和.vcxproj文件的解决方案文件。它输出一个.dgml文件,您可以在visualstudio中打开该文件,并以图形格式检查项目依赖关系。
    如果它不能完全满足您的需要,您可以分叉它并对其进行修改以满足您的需要。