代码之家  ›  专栏  ›  技术社区  ›  Migol

VisualStudio项目的依赖关系图

  •  104
  • Migol  · 技术社区  · 15 年前

    我目前正在将一个大型解决方案(约70个项目)从VS2005+.NET2.0迁移到VS2008+.NET3.5。目前我有VS2008+.NET2.0。

    13 回复  |  直到 15 年前
        1
  •  187
  •   Uwe Keim Tomasz    5 年前

    我需要类似的东西,但不想花钱(或安装)一个工具来完成。我 created a quick PowerShell script that goes through the project references 然后把它们吐出来 yuml.me

    Function Get-ProjectReferences ($rootFolder)
    {
        $projectFiles = Get-ChildItem $rootFolder -Filter *.csproj -Recurse
        $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
    
        $projectFiles | ForEach-Object {
            $projectFile = $_ | Select-Object -ExpandProperty FullName
            $projectName = $_ | Select-Object -ExpandProperty BaseName
            $projectXml = [xml](Get-Content $projectFile)
    
            $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"
    
            $projectReferences | ForEach-Object {
                "[" + $projectName + "] -> [" + $_ + "]"
            }
        }
    }
    
    Get-ProjectReferences "C:\Users\DanTup\Documents\MyProject" | Out-File "C:\Users\DanTup\Documents\MyProject\References.txt"
    
        2
  •  85
  •   Evgeniy Berezovsky    10 年前

    自版本8以来的ReSharper已内置 'View Project Dependencies' 特色

    Internal feature 使用yFiles查看器在中显示依赖关系图。请参阅文章底部的快速手册。

    enter image description here

    如何

    1. here .
    2. 转到ReSharper/Internal/Show Dependencies。
    3. 指定要包含在“全局”中的项目。
    4. 除非需要,否则取消选中“排除终端节点…”。
    5. 在yEd中使用分层布局(Alt+Shift+H)
    6. 提供反馈=)
        3
  •  49
  •   Patrick from NDepend team    4 年前

    http://ndepend.com


    为了在2020年4月完成@Eriawan答案,发布了独立版本2020.1 Dependency Graph 完全重建。它现在可以扩展到由数百个项目组成的大型解决方案,并提供许多导航设施。

    这是它在屏幕上的样子 NopCommerce OSS project

    NDepend Dependency Graph on NopCommerce

    下面是整个.NET Core 3类库(176个程序集)的外观。

    enter link description here

    免责声明:我在NDepend工作

        4
  •  32
  •   Richard    14 年前

    您可以使用Visual Studio 2010 Ultimate轻松获取项目依赖关系图,在本视频中扫描5分钟,了解如何: http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer.aspx

        5
  •  22
  •   devio    13 年前

    我写了一个可能对你有帮助的工具。 VS Solution Dependency Visualizer 分析解决方案中的项目依赖关系,并根据此信息创建依赖关系图以及文本报告。

        8
  •  8
  •   Dharman chazomaticus    4 年前

    尝试 DependenSee

    安装

    • dotnet tool install dependensee --global

    • 安装后,运行 dependensee "path/to/root/of/csproj/files" "path/to/output.html"

    • 默认情况下,它不包括nuget包,但可以使用启用 -P

    • dependensee 没有args。

    DependenSee Graph

        9
  •  5
  •   Patrick from NDepend team    13 年前

    要完成由NDepend生成的图表上的eriawan答案,请参见下面的屏幕截图。你可以 download and use the free trial edition

    More on NDepend Dependency Graph enter image description here

    More on NDepend Dependency Matrix enter image description here

    免责声明:我是工具团队的一员

        10
  •  5
  •   Community Mike Causer    7 年前

    这个 Powershell solution

    #!/bin/bash
    
    for i in `find . -type f -iname "*.csproj"`; do
        # get only filename
        project=`basename $i`
    
        # remove csproj extension
        project=${project%.csproj}
    
        references=`cat $i | grep '<ProjectReference' | cut -d "\"" -f 2`
        for ref in $references; do
            # keep only filename (assume Windows paths)
            ref=${ref##*\\}
    
            # remove csproj extension
            ref=${ref%.csproj}
    
            echo "[ $project ] -> [ $ref ]"
        done
    
    done
    
        11
  •  4
  •   Hace    14 年前

    您可以在项目中创建一个很好的引用图。我在我的博客上描述了我做这件事的方式 http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/

        12
  •  4
  •   Steven J    5 年前
        13
  •  3
  •   Kieran Benton    15 年前

    如果您只是想要一个依赖关系图,我发现这是获得依赖关系图的最干净的方法之一:

    Dependency Analyser

        14
  •  1
  •   Svein Terje Gaup    4 年前

    Danny Tuppeny的PS脚本的扩展版本显示了项目和外部引用:

    Function Get-ProjectReferences($rootPath)
    {
      $projectFiles = Get-ChildItem $rootPath -Filter *.csproj -Recurse
      $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
    
      $projectFiles | ForEach-Object {
        $projectFile = $_ | Select-Object -ExpandProperty FullName
        $projectName = $_ | Select-Object -ExpandProperty BaseName
        $projectXml = [xml](Get-Content $projectFile)
    
        $projectReferences = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Name' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text"
        $projectReferences | ForEach-Object {
            "PR:[" + $projectName + "]:[" + $_ + "]"
        }
      }
    
      $projectFiles | ForEach-Object {
        $projectFile = $_ | Select-Object -ExpandProperty FullName
        $projectName = $_ | Select-Object -ExpandProperty BaseName
        $projectXml = [xml](Get-Content $projectFile)
    
        $externalReferences = $projectXml | Select-Xml '//defaultNamespace:Reference/@Include' -Namespace $ns
        $externalReferences | ForEach-Object {
            "ER:[" + $projectName + "]:[" + $_ + "]"
        }
    
      }
    
    }
    
    Get-ProjectReferences "C:\projects" | Out-File "C:\temp\References.txt"
    

    它将提供一个以冒号分隔的文件,可以在Excel中打开和分析。

        15
  •  0
  •   Paweł Audionysos    6 年前

    我检查了所有答案,但没有一个选项令我满意,所以我编写了自己的工具来预览项目依赖项。

    https://github.com/Audionysos/VSProjectReferencesViewer

    这是早期阶段,但它满足了我的需要:)

        16
  •  0
  •   Ilyan    4 年前

    此扩展版本的 PS Script from Danny Tuppeny 显示两者的引用 vcxproj

    -深度-最大依赖链长度

    -Like-仅打印从具有的项目开始的依赖项链 name-like$like

    -反向-打印反向依赖链(

    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$false)]
        [string]$RootFolder = ".",
        [Parameter(Mandatory=$false)]
        [string]$Like = "*",
        [Parameter(Mandatory=$false)]
        [string]$UntilLike = "*",
        [Parameter(Mandatory=$false)]
        [switch]$Reverse,
        [Parameter(Mandatory=$false)]
        [int]$Depth=1
    )
    
    $arrow = if ($script:Reverse) { "<-" } else { "->" }
    
    Function PrintTree ($projectNameToProjectNameList, $projectName, $maxDepth = 1, $prefix = "")
    {
        $print = $script:UntilLike -eq "*" -or $projectName -Like $script:UntilLike
        $stop = $projectNameToProjectNameList[$projectName].count -eq 0 -or $maxDepth -eq 0 -or ($script:UntilLike -ne "*" -and $projectName -Like $script:UntilLike)
        
        if ($stop) {
            if ($print) {
                $prefix + "[$projectName]"
            }
        } else {
            $prefix += "[$projectName] $arrow "
            --$maxDepth
            $projectNameToProjectNameList[$projectName] | % { PrintTree $projectNameToProjectNameList $_ $maxDepth $prefix }
        }
    }
    
    Function Get-ProjectReferences ($rootFolder)
    {
        $projectFiles = Get-ChildItem $rootFolder -Filter *.csproj -Recurse
        $projectFiles += Get-ChildItem $rootFolder -Filter *.vcxproj -Recurse
        $ns = @{ defaultNamespace = "http://schemas.microsoft.com/developer/msbuild/2003" }
        
        $projectGuidToProjectName = @{}
        $projectNameToProjectReferenceGuidList = @{}
    
        $projectFiles | ForEach-Object {
            $projectFile = $_ | Select-Object -ExpandProperty FullName
            $projectName = $_ | Select-Object -ExpandProperty BaseName
            $projectXml = [xml](Get-Content $projectFile)
            
            $projectGuid = $projectXml | Select-Xml '//defaultNamespace:ProjectGuid' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text" | % { $_ -as [Guid] }
            $projectGuidToProjectName[$projectGuid] = $projectName
    
            $projectReferenceGuids = $projectXml | Select-Xml '//defaultNamespace:ProjectReference/defaultNamespace:Project' -Namespace $ns | Select-Object -ExpandProperty Node | Select-Object -ExpandProperty "#text" | % { $_ -as [Guid] }
            if ($null -eq $projectReferenceGuids) { $projectReferenceGuids = @() }
            $projectNameToProjectReferenceGuidList[$projectName] = $projectReferenceGuids
        }
    
        $projectNameToProjectReferenceNameList = @{}
        foreach ($projectName in $projectNameToProjectReferenceGuidList.keys) {
            $projectNameToProjectReferenceNameList[$projectName] = $projectNameToProjectReferenceGuidList[$projectName] | % { $projectGuidToProjectName[$_] } | sort
        }
        
        if ($script:Reverse) {
            $projectReferenceNameToProjectNameList = @{}
            foreach ($projectName in $projectNameToProjectReferenceNameList.keys) {
                foreach ($projectReferenceName in $projectNameToProjectReferenceNameList[$projectName]) {
                    if (!$projectReferenceNameToProjectNameList.ContainsKey($projectReferenceName)) { $projectReferenceNameToProjectNameList[$projectReferenceName] = @() } 
                    $projectReferenceNameToProjectNameList[$projectReferenceName] += $projectName
                }
            }
    
            foreach ($projectName in $projectReferenceNameToProjectNameList.keys -Like $script:Like) {
                PrintTree $projectReferenceNameToProjectNameList $projectName $script:Depth
            }
        } else {
            foreach ($projectName in $projectNameToProjectReferenceNameList.keys -Like $script:Like) {
                PrintTree $projectNameToProjectReferenceNameList $projectName $script:Depth
            }
        }
    }
    
    Get-ProjectReferences $RootFolder
    
        17
  •  0
  •   Will    4 年前

    如果您正在寻找一种不需要任何外部工具的方法,您可以导航到项目的 obj/project.assets.json 文件该文件在构建过程中生成,并且具有依赖项的层次JSON结构(项目引用和nuget包)。