Obecnie przeprowadzam migrację dużego rozwiązania (~ 70 projektów) z VS 2005 + .NET 2.0 do VS 2008 + .NET 3.5. Obecnie posiadam VS 2008 + .NET 2.0.
Problem polega na tym, że muszę przenosić projekty jeden po drugim do nowej platformy .NET, upewniając się, że żaden projekt .NET 2.0 nie odwołuje się do projektu .NET 3.5. Czy jest jakieś narzędzie, które dałoby mi ładny wykres zależności projektu?
Potrzebowałem czegoś podobnego, ale nie chciałem płacić za (ani instalować) narzędzia do tego. I stworzył krótki skrypt PowerShell, który przechodzi przez odniesień projektowych i wyrzuca je w yuml.me przyjaznym formacie zamiast:
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"
źródło
=$true
do parametrówMandatory
iValueFromPipeline
Aktualizacja: ReSharper od wersji 8 ma wbudowaną funkcję „Wyświetl zależności projektu” .
Wersja <8 ReSharper ma wewnętrzną funkcję pokazującą wykresy zależności w przeglądarce yFiles. Zobacz skróconą instrukcję na dole posta.
Jak
źródło
Możesz łatwo uzyskać wykres zależności projektu za pomocą Visual Studio 2010 Ultimate, zeskanuj ten film do 5 minut, aby zobaczyć, jak: http://www.lovettsoftware.com/blogengine.net/post/2010/05/27/Architecture-Explorer .aspx
W programie Visual Studio 2010 Ultimate: Architecture | Wygeneruj wykres zależności | Według montażu.
źródło
Napisałem narzędzie, które może ci pomóc. VS Solution Dependency Visualizer analizuje zależności projektów w ramach rozwiązania i tworzy wykres zależności na podstawie tych informacji, a także raport tekstowy.
źródło
Miałem podobny problem, ale był on jeszcze bardziej skomplikowany, ponieważ kilka projektów odwoływało się do różnych wersji tego samego zestawu.
Aby uzyskać dane wyjściowe, które zawierają informacje o wersji i sprawdzają możliwe problemy z ładowaniem zestawu w czasie wykonywania, stworzyłem to narzędzie:
https://github.com/smpickett/DependencyViewer
(bezpośredni link do wersji na Github: https://github.com/smpickett/DependencyViewer/releases )
źródło
Możesz utworzyć wykres zależności swoich projektów w VS 2010 Ultimate. Architecture Explorer umożliwia przeglądanie rozwiązania, wybieranie projektów i relacji, które chcesz wizualizować, a następnie tworzenie wykresu zależności na podstawie dokonanego wyboru.
Aby uzyskać więcej informacji, zobacz następujące tematy:
Instrukcje: generowanie dokumentów wykresów na podstawie kodu : http://msdn.microsoft.com/en-us/library/dd409453%28VS.100%29.aspx#SeeSpecificSource
Instrukcje: znajdowanie kodu za pomocą narzędzia Architecture Explorer : http://msdn.microsoft.com/en-us/library/dd409431%28VS.100%29.aspx
Pobieranie RC : http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a .
Forum narzędzi do wykrywania i modelowania architektury programu Visual Studio 2010 : http://social.msdn.microsoft.com/Forums/en-US/vsarch/threads
źródło
Aby uzupełnić odpowiedź eriawan na wykresach generowanych przez NDepend, zobacz poniższe zrzuty ekranu. Możesz pobrać bezpłatną wersję próbną NDepend i korzystać z niej przez chwilę.
Więcej na temat wykresu zależności NDepend
Więcej o macierzy zależności NDepend :
Zastrzeżenie: jestem częścią zespołu narzędziowego
źródło
Rozwiązanie Powershell jest najlepsze. Zaadaptowałem go do skryptu bash, który działa na moim komputerze (TM):
#!/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
źródło
Możesz stworzyć ładny wykres odniesień w swoich projektach. Sposób, w jaki to zrobiłem, opisałem na swoim blogu http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/
źródło
Jeśli potrzebujesz po prostu wykresu zależności, który znalazłem, jest to jeden z najczystszych sposobów na jego uzyskanie:
Analizator zależności
źródło
W programie VS 2019 zmieniono nazwę modułu wykresu zależności na Code Map
tutaj jest oficjalna dokumentacja: https://docs.microsoft.com/en-us/visualstudio/modeling/map-dependencies-across-your-solutions?view=vs-2019
źródło
Ta rozszerzona wersja skryptu PS autorstwa Danny'ego Tuppeny'ego zawiera odniesienia do projektu i zewnętrzne:
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"
Daje plik rozdzielony dwukropkami, który można otworzyć i przeanalizować w programie Excel.
źródło
Ta rozszerzona wersja skryptu PS autorstwa Danny'ego Tuppeny'ego pokazuje odniesienia do plików csproj i vcxproj , a także obsługuje
-Depth - maksymalna długość łańcucha zależności
-Like - wyświetla tylko łańcuchy zależności zaczynające się od projektów o nazwie -jak $ Like
-UntilLike - ucina łańcuchy zależności w projektach o nazwie $ UntilLike
-Reverse - wyświetla odwrócone łańcuchy zależności ( [proj] <- [referencing proj] )
[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
źródło
Jeśli szukasz sposobu, który nie wymaga żadnych zewnętrznych narzędzi, możesz przejść do
obj/project.assets.json
pliku projektu . Ten plik jest generowany podczas kompilacji i ma hierarchiczną strukturę JSON zależności (zarówno odwołania do projektu, jak i pakiety nuget).Jest to przydatne do odpowiadania na pytania typu „dlaczego do cholery ta biblioteka DLL projektu jest wciągana do katalogu kompilacji?”
źródło
Sprawdziłem wszystkie odpowiedzi, ale żadna z opcji nie była dla mnie satysfakcjonująca, więc napisałem własne narzędzie do podglądu zależności projekt-projekt.
https://github.com/Audionysos/VSProjectReferencesViewer
To wczesny etap, ale zadziałał na moje potrzeby :)
źródło