MSBuild.exeと環境変数について質問があります。まず、開発環境:
コードは主にC++であり、いくつかのC#が含まれています。5,000を超えるクラス、340のプロジェクト、200のソリューションが深いソースツリーに配置されています。ツリーのルートとツリーの他のさまざまなポイントに解決策があります。TFSを使用し、一連の将来のリリースのために複数のアクティブなブランチを維持します。各開発者は、ローカルビューを使用して、コードを変更およびテストします。一部の開発者は、複数のブランチで同時に作業します。開発者は、異なるTFSブランチから同時にソリューションを構築することがあります。
共有ヘッダーファイルやライブラリなどを見つけるために約70の環境変数を使用します。VS2008では、ソリューションファイルと同じベース名と.slnenvの拡張子を持つファイルを環境変数の定義に使用しました。すべての変数は、ソースツリーのベースを基準にして定義されます。この.slnenvファイルは、VS2008プロセススペースに環境変数を作成するカスタムVS2008アドインによって読み取られます。
MyProjectDir=$(SolutionDir)\..\..
MyRoot=$(MyProjectDir)\..\..
MyInstallDir=$(MyRoot)\Install
MySourceDir=$(MyRoot)\Source
MyUnmanagedSourceDir=$(MySourceDir)\My\Unmanaged
MyIncludeDirs=$(MyProjectDir);$(MyUnmanagedSourceDir)
MSBuildは、ソリューションの読み込み後に作成された環境変数を継承しないため、このアドインはVS2010では正しく機能しません。
私の質問は、これらの環境変数をMSBuildに取得するにはどうすればよいですか?動作する2つの方法を見つけましたが、これまで使用していたアドインほど便利ではありません。
VS2010は、最初にプロセススペースに環境変数を設定し、次にVS2010を起動するコマンドスクリプトを使用して起動できます。MSBuildはこれらの環境変数を継承します。ソリューションをロードできるさまざまなポイントに合わせてスクリプトをカスタマイズする必要があるため、これでは不十分です。
私が試した2番目の方法は、プロパティシートと.vcxprojファイルで環境変数をプロパティとして定義することです。すべての.vcxprojファイルがロードする基本プロパティシートがあります。そのプロパティシートで:
<PropertyGroup>
<MyRoot>$(MyProjectDir)\..\..</MyRoot>
<MyInstallDir>$(MyRoot)\Install</MyInstallDir>
<MySourceDir>$(MyRoot)\Source</MySourceDir>
<MyUnmanagedSourceDir>$(MySourceDir)\My\Unmanaged</MyUnmanagedSourceDir>
<MyIncludeDirs>$(MyProjectDir);$(MyUnmanagedSourceDir)</MyIncludeDirs>
</PropertyGroup>
次に、各.vcxprojファイルでベースディレクトリを定義できます。
<PropertyGroup>
<MyProjectDir>..\..</MyProjectDir>
</PropertyGroup>
このメソッドは、アドインがすべての環境変数を絶対パス名に解決する相対パス名を使用します。プロジェクトファイルがソースルートからどれだけ離れているかによって「MyProjectDir」の定義が異なる340個の.vcxprojファイルを編集する必要はありません。これまでのところ、この方法を1つのプロジェクトで試しました。
アドインを変更して、環境変数ではなくプロパティを作成しようとしました。ENV2.get_Properties()を使用してみましたが、これはVS2010で定義されたプロパティでのみ機能し、定義したプロパティでは機能しないようです。
ありがとう、ダン・カリー