【问题标题】:Get a list of all direct and indirect project dependencies from MSBuild从 MSBuild 获取所有直接和间接项目依赖项的列表
【发布时间】:2026-02-16 15:20:02
【问题描述】:

背景

我有一个巨大的应用程序,它被分成数十个(数百个?)较小的 C# 项目。为了构建它,我只需调用

msbuild my_root_project.csproj

作为根项目只需导入所有需要的子项目(可以导入其他子项目,可以导入其他子项目,...)。 这很好用,因为 MSBuild 会遍历所有依赖项并一一构建它们。结果,我的构建输出文件夹中出现了一堆 dll(例如 Debug)。

附加信息

这里重要的是,这是一个来自前 NuGet 时代的相当古老的项目。因此,没有什么能比得上一个包含所有外部依赖项摘要的文件了。相反,我通过以下方式将所有外部二进制文件存储在“ext_libs”文件夹中:

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

这些外部二进制文件可以在任何 CsProjects 中引用。此外,我的根项目使用的多个子项目甚至可能导入同一个库(例如,其中许多使用 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 文件,但显然我更喜欢使用现有工具而不是创建自定义工具。

其他限制

  • 由于某种原因,我不能只检查输出文件夹的内容,所以这不是一个选项。
  • 最好是 .NET 4,但如果问题可以在框架的更新版本中轻松解决...好吧 - 仍然很高兴听到解决方案 :)。

【问题讨论】:

    标签: c# .net msbuild


    【解决方案1】:

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

    【讨论】:

      最近更新 更多