解決策またはプロジェクトファイルを編集したくない場合は、MSBuildのコマンドラインからはうまくいきますが、Visual Studioではうまくいきません。
まず、あなたが実行したときにあなたが得るエラー:
MSBuild Solution1.sln /t:Foo
はPROJECTAはFooのターゲットが含まれているが、溶液自体はFooのターゲットが含まれていないことをしないということではありません。 @Jaykulが示唆するように、MSBuildEmitSolution環境変数を設定すると、ソリューションmetaprojに含まれるデフォルトのターゲットが明らかになります。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Foo">
<MSBuild Projects="@(ProjectReference)" Targets="Foo" BuildInParallel="True" Properties="CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" SkipNonexistentProjects="%(ProjectReference.SkipNonexistentProjects)" />
</Target>
</Project>
:あなたは、次のような内容で、ソリューションファイル(ファイル名パターンが重要である)に新しいファイル「before.Solution1.sln.targets」を導入することができますインスピレーションとしてmetaprojを使用して
MSBuild要素は、ほとんどの場合、ソリューションのメタプロジの公開ターゲットからコピーされます。シナリオに合わせてターゲット名やその他の詳細を調整します。
このファイルを使用すると、ProjectAにFooターゲットが含まれていないというエラーが表示されます。 ProjectBは、プロジェクト間の依存関係に応じてビルドされても、ビルドされなくてもよい。
この問題を解決するためには、すべてのプロジェクトに空のFooターゲットを与え、実際にすでに存在するプロジェクトでオーバーライドする必要があります。
「EmptyFoo」などの別のファイルを導入することでこれを行います。ターゲット」(名前は重要ではない)次のようになります。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Foo" />
</Project>
そして、我々は自動的に例えば、追加のプロパティでのMSBuildを実行することにより、いずれか、このファイルをターゲットインポートするすべてのプロジェクトを取得:
MSBuild Solution1.sln /t:Foo /p:CustomBeforeMicrosoftCommonTargets=c:\full_path_to\EmptyFoo.targets
か最初のターゲットファイル内のMSBuild要素のProperties属性にCustomerBeforeMicrosoftCommonTargetsプロパティを追加します。$(SolutionDir)プロパティに関連するフルパスを指定することもできます。
ただし、Fooを結合して実行する場合(ビルド、リビルド、クリーン、パブリッシュ)のいずれかを使用すると、MSBuildのWebパブリッシングパイプがDeployOnBuildプロパティを使用して、他のプロジェクトを含むソリューションのWebプロジェクトのパブリッシュターゲットを呼び出す方法のインスピレーションを得ることができますパブリッシングをサポートしないタイプ。ここbefore.Solution1.sln.targetsファイルの
さらに詳しい情報: http://sedodream.com/2010/10/22/MSBuildExtendingTheSolutionBuild.aspx