2017-01-19 12 views
0

特定のC#ソリューションのすべてのexe/dllプロジェクトからカスタムメタデータを取得するPowershellスクリプトを作成中です。PowershellでMSBuildライブラリを使用してアクティブなソリューションビルド構成をプログラムで決定する方法

Microsoft.MSBuildアセンブリ(構造と評価の名前空間)を使用してソリューションファイルを解析し、メタデータを取得するためにプロジェクトを繰り返し処理しています。これはすべてうまくいく。

次に、Visual Studio構成マネージャで[ビルド]ビットがチェックされているソリューションのアクティブビルド/プラットフォーム構成の一部であるプロジェクトにのみ集中します。

私はプロジェクトビルド構成プロパティのリストを収集することができますが、ソリューションファイルがアクティブソリューションビルドとアクティブプラットフォーム構成の選択値をどのように格納するかを見つけるのには苦労しています。

また、私はMSBuildライブラリのソースコードも見直しました。たとえば、次の文字列を使用してプロジェクトとソリューションの構成を一致させるように見えます:.Debug - ビルド|すべてのCPU.ActiveCfg =デバッグ|任意のCPU。

ソリューションやプロジェクトのアクティブビルド/プラットフォームの設定をどのように決定する必要があるのか​​、誰にも分かりますか?

+0

このスクリプトは、最終的にビルド検証プロセスの一環として、TFSで実行されますのでご注意ください。また、EnvDTEが別のオプションかもしれないかどうか疑問に思う。 – str8ball

+0

VSのplatform/configのような揮発性の設定は、ソリューションの.suoファイルに保存されていると思います。それらは通常、ソース管理にはありません。ユーザ/マシン固有のものですから、どう対処するのだろうか?とにかく、これらのファイルはバイナリであり、VSによってのみ使用されるため、実際にはmsbuildには関係しません。 EnvDTEはおそらく行く方法です。 – stijn

+1

@stign、あなたは優れた点を作っています。私がやろうとしているのは、TFSポストビルドを介して最終的に実行されるため、ビルドサーバーは構成パラメータを提供します。それは私が密集している!ヘッドチェックありがとう。 – str8ball

答えて

0

@stignからのフィードバックは正しい方向に動いています。少し冗長、それは私が

スクリプトの擬似コードを必要とするものを行い、次のとおりです。

Add-Type -Path "C:\Program Files (x86)\Reference Assemblies\Microsoft\MSBuild\v14.0\Microsoft.Build.dll" 

$slnFile = [Microsoft.Build.Construction.SolutionFile]::Parse("<path_to_solution>") 

$slnFile.ProjectsInOrder | Where-Object { $_.ProjectType -eq "KnownToBeMSBuildFormat" } | % { 

$outValue = $null 
$found = $_.ProjectConfigurations.TryGetValue("Debug|Any CPU", [ref]$outValue) 

    if($found) 
    { 
     if($outValue.IncludeInBuild) # This bit is set by the MS code when parsing the project configurations with ...Build.0 
     { 
      #Do stuff here 
     } 
    } 
} #End collection iterate 
+0

私はあなたがこの問題を解決したことを知っていることを知っています。答えをマークしてください。同様の問題を抱えている他のコミュニティにとって有益です。 –

関連する問題