2013-04-07 7 views
7

Solution1.sln存在しません無視目標は二つのプロジェクトが含まれますMSBuildの:

  • ProjectA.csproj
  • ProjectB.csproj

をProjectBのは、 "フー" と呼ばれる独自の目標を持っています。私が実行したい:

MSBuildのSolution1.sln/T:Fooの

PROJECTAは "foo" という目標を定義していないので、これは失敗します。

解決策が見つからないターゲットを無視する方法はありますか? (たとえば、ターゲットが特定のプロジェクトに対して存在しない場合は何もしない)、SLNやプロジェクトファイルを変更しないでください。

答えて

6

解決策またはプロジェクトファイルを編集したくない場合は、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

1

おそらく最高の答えではなく、合理的なハックです。

msbuild ProjectA.csproj 
msbuild ProjectB.csproj /t:Foo 
1

あなたは/トンのように、プロジェクト名によってそれらをターゲットにすることができます:プロジェクト:目標(私は思い出すことができない、引用符が必要な場合があります)。

環境変数MSBuildEmitSolution = 1 ...を設定すると、生成されたすべてのターゲットを見つけることができます。これにより、msbuildはソリューション用に生成するtemp .metaprojファイルをディスクに保存します。そのファイルに定義されているすべてのターゲットがあり、それを開いて見てみるだけです)

1

msbuildビルドソリューション - msbuildは、制限されたターゲットセットを.metaprojファイルに、afaik - ビルドできませんビルドslnファイルを介してカスタムターゲット、元のproject1.csprojまたはカスタムビルドスクリプトを使用する必要があります。