3

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で定義されたプロパティでのみ機能し、定義したプロパティでは機能しないようです。

ありがとう、ダン・カリー

4

1 に答える 1

1

電子メールで議論した後、Dan が必要とするものは何かを把握し、次のメッセージが質問の問題を解決するのに役立ちました。彼は、これが他の SO メンバーに役立つ可能性があることに同意します。

ああ、今わかりました。

私がそのトピックから理解したように-ビルドステップ(include句のパス、dll\exe依存関係を解決するためのビルドツールへのパス)にのみ必要なものがすべて必要であり、通常の開発者の活動はそれに依存しません。最初の読み込み後に環境変数を再初期化しないことについて VStudio と戦う必要がないため、それは良いことです。膨大な量のプロジェクト ファイルのソリューションを編集して実装する必要があるだけです ;) タスクがはるかに簡単になります :D

小さな免責事項 - 私はこれを路上で書いており、それ以降のすべての推奨事項をチェックして防弾するための本格的な開発環境にアクセスすることはできません.

msbuild のいくつかの機能に注意を向けたいと思います: http://msdn.microsoft.com/en-us/library/ms164309.aspx

すべてのスクリプトとプロジェクトで使用できる定義済みのプロパティがあります。これは、最初の問題である相対パスではなく絶対パスを解決するのに役立つようです。これは、さらに参照するためのリンクからの小さな抜粋です

$(MSBuildProjectDirectory) - 
The absolute path of the directory where the project file is located, for example, C:\MyCompany\MyProduct.

$(MSBuildProjectFile) - 
The complete file name of the project file, including the file name extension, for example, 
MyApp.proj.

$(MSBuildProjectExtension)
The file name extension of the project file, including the period, for example, .proj.

$(MSBuildProjectFullPath)
The absolute path and complete file name of the project file, for example, C:\MyCompany\MyProduct\MyApp.proj.

$(MSBuildProjectName)
The file name of the project file without the file name extension, for example, MyApp.

したがって、この定義済みのプロパティをプロパティ シートで使用できるはずです。さて、msbuild 4.0 ツールセット (ルート スクリプト要素の属性 ToolsVersion="" で定義されたツールセット) には 、興味深い トリックあります次の方法(すべてのprojファイルの編集を避けるか、少なくとも-編集を非常に単純化されたコピーアンドペースト部分に減らすのに役立つと思います)プロパティシートファイルを含めるために相対パスを使用して定義します

<CustomBeforeMicrosoftCommonTargets>$(MSBuildProjectFile)\ConcreteProjectCustomProperties.propz</CustomBeforeMicrosoftCommonTargets>

CustomBeforeMicrosoftCommonTargetsは、すべてのセカンダリによって継承されるグローバル スコープのプロパティである必要があること に注意してください。

ConcreteProjectCustomProperties.propzを適切に定義すれば、必要なものを達成できると思います。「適切に」とは、そこにグローバル プロパティ ファイル (相対パスまたは絶対パスを使用) を含め、すべてのプロジェクト レベルのプロパティを定義することです。

NB:また、後で定義されたプロパティは、初期に定義されたものへの参照には使用できないことに注意してください。例では、 $(MyProjectDir)を参照して$(MyIncludeDirs)を定義していますが、$(MyProjectDir)は少し後で宣言および定義されています。これは、そのコードの「サンプル化」と高速チャーニングが原因である可能性がありますが、本番環境で同じように変数を定義すると、微妙なエラーが発生する可能性があります。

問題が適切に解決されたことを願っています。私の説明が、すべてのプロパティをカスタム アドオンからよりシンプルでネイティブな msbuild スクリプトにすばやく移行するのに役立つことを願っています ;)

于 2012-09-29T06:23:20.837 に答える