プロジェクトでの日曜大工関係分析

大規模なプロジェクトの理解を開始するには、プロジェクト内の論理モジュールとその接続方法を理解する必要があります。 製品の高価なエディションでVisual Studioを使用する場合、さまざまな依存関係グラフを構築するための関数が利用可能です。 残念ながら、まず、[アーキテクチャ]メニューのあるスタジオは非常に高価です。 第二に、まだビルド中で、Visual Studio 2008専用のプロジェクトファイルがある古いプロジェクトでは、スタジオ自体は特別なものを提供しません。



もちろん、この目的のために高価なツール(たとえば、Understand)があることに注意してください。 しかし、初心者にとっては、PowerShellで小さなスクリプトをスケッチするだけで十分でした。 このスクリプトは、slnファイルに基づいてGraphVizのドットファイルを生成します。 その結果、下の図のようなスキームが得られ、プロジェクトの理解を開始できます。







さらに、このスクリプトの仕組みを説明します。



最初に必要なことは、slnファイルとそこに書き込まれているプロジェクトファイルを分析することでした。 slnファイルを使用すると、すぐにラッキーになりました。 スタジオの異なるバージョン(Visual Studio 2008以降)では、プロジェクトのリストは次の形式の行のセットのように同じに見えます。



Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BaseClasses Apr05", "..\..\3rd_party\BaseClasses_Apr05\baseclasses90.vcproj", "{2A939EC4-235F-4879-9D38-C865FFD54D82}" EndProject
      
      





PowerShellでは、このようなすべての行のリストを1行で取得できます。



 Select-String -LiteralPath $slnFile -Pattern "Project\(.*vcproj"
      
      





$ slnFileはファイルへのパスであり、「Project \(。* Vcproj」は文字列を選択するための正規表現です。slnファイルでは、すべてのパスは相対です。次のタスクは、受信行から相対パスを抽出し、これをファイルに追加します。



 Join-Path -Path $slnPath -ChildPath ($s -split ',')[1].Trim().Replace('"','')
      
      





ここでは、$ sが以前に受信した文字列の1つを含むと想定されています。 コマンド($ s -split '、')を使用して、コンマで区切られた部分文字列に分割されていることは明らかです。 2番目のサブストリング([1]を使用して取得)には、相対パスのみが含まれます。 トリムで余分なスペースを削除し、置換で引用符を削除します。 次に、 Join-Pathコマンドを使用して相対パスにslnファイルのパスを添付します。 これをループでラップして、プロジェクトへの一連のパスを取得しました。 ここで、プロジェクトファイルに取り組み、それらの間の依存関係を見つけます。



Microsoftは、Vistual Studio 2010への移行時にプロジェクトファイルの形式を変更しました。 しかし、良い点は、VS2008とVS2010の両方のソリューションファイルがXML形式であることです。 これにより、XPathクエリ言語を使用して、必要なフィールドを簡単に取得できます。 PowerShellでは、これはSelect-Xmlコマンドを使用して行われます。 これを使用すると、プロジェクトファイルから依存関係を簡単に抽出できます。 また、最終グラフのさまざまなタイプのプロジェクトをさまざまな色で表示したいと思います。 これを行うには、タイプとは何かを調べます。 これは、多数のプロジェクトがあるディレクトリで次のコマンドを設定することで実行できます。



 PS D:\test> Get-ChildItem -Path . -Filter *.vcxproj -Recurse | Select-Xml -XPath "//*[local-name()=`"ConfigurationType`"]/text()" | % { Write-Output $_.Node.Value }
      
      





PowerShellでは、「|」記号を使用して、コマンド実行の結果を含むストリームを次のコマンドにリダイレクトすると便利な場合があります。 Get-ChildItemコマンドは、タイプvcxprojのすべてのファイルを見つけるのに役立ち、Select-Xmlはそれらから構成タイプを選択します。 各ファイルについて、画面にプロジェクトタイプを表示します。 多数のファイルがある場合、出力はあまり有益ではありませんが、PowerShellには、結果をグループ化して状況を保存するGroup-Objectコマンドがあります。 したがって、次のようになります。



 PS D:\test> Get-ChildItem -Path . -Filter *.vcxproj -Recurse | Select-Xml -XPath "//*[local-name()=`"ConfigurationType`"]/text()" | % { Write-Output $_.Node.Value } | Group-Object Count Name Group ----- ---- ----- 92 StaticLibrary {StaticLibrary, StaticLibrary, StaticLibrary, StaticLibrary...} 287 Application {Application, Application, Application, Application...} 424 DynamicLibrary {DynamicLibrary, DynamicLibrary, DynamicLibrary, DynamicLibrary...}
      
      





同様に、タイプvcproj、csprojなどのファイルに対しても実行できます。 vcprojファイルでは、構成タイプは数字でエンコードされますが、Visual Studioでプロジェクトを開くことで注目に値するものを見つけるのは難しくありません。



この段階では、プロジェクト、そのタイプ、およびそれらの間の関係があります。 GraphVizファイルを生成できます。 これは非常に簡単に行われます-すぐに次の形式のヘッダーを記述します:



 digraph ProjectName { size="60,60"; rankdir=LR; overlap=false; splines=true; dpi=300; node[color=mediumorchid3, style=filled, shape=box, fontsize=10, fontcolor=white]; edge[arrowhead=vee, arrowtail=inv, arrowsize=.7, fontsize=10, fontcolor=navy]; labelloc=t; label="Solution: ProjectName.sln"; fontsize=14;
      
      





そして、すべてのプロジェクトとそれらの間のリンク:



 "project1.vcproj" [color=indigo]; "project1.vcproj" -> "project2.vcproj" [color="#C3E500"]; "project2.vcproj" [color=indigo];
      
      





リンクの色は、グラフを読みやすくするためにプロジェクトに関連付けられています。 つまり 各プロジェクトには、同じ色のすべての発信接続があります。 これを行うには、HSL(英語、色相、彩度、明度)の色表現を使用します。 SおよびLコンポーネントを修正し、次のプロジェクトファイルを処理するときにHを変更します。 次に、HSLをRGBに変換し、出力ファイルに書き込みます。



カラーピッカーのソースコードとその他のスクリプトは、 GitHubにあります



All Articles