私のプロジェクトでは、外部ツールを実行していくつかのバイナリファイルを更新しています。これらのファイルは「コンテンツ」としてプロジェクトに含まれています。
現時点では、ツールはC#プロジェクトプロパティの「ビルド前イベント」中に実行されるように設定されています。残念ながら、このイベントはプロジェクトが古い場合にのみ実行されますが、これは私が必要とするものではありません。
私はプロジェクトで「ビルド」の代わりに「リビルド」を常に使用することでこれを回避していますが、これは退屈で時間がかかります。
プロジェクトが最新であるかどうかに関係なく、このツールを常に実行する必要があります。実際、ツールはプロジェクトに含まれるファイルの一部を変更するため、MSBuildはプロジェクトが最新かどうかを判断する前であっても、最新のチェック結果に影響します。
それを行う適切な方法はありますか?
これが解決策です。プロジェクトファイルでこのプロパティを定義します。
<PropertyGroup>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
PreBuildStepは、プロジェクトが最新かどうかに関係なく、毎回実行されます。
Visual Studioは、MSBuildの通常の最新のチェックをバイパスし、より高速ですが、カスタマイズされたビルドターゲットを壊すという副作用がある何らかのカスタムチェックを使用しているようです。
プロジェクトレベルでは、次の3つのオプションがあります。
1)ビルド前のアクション
<PropertyGroup>
<PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>
2)通常のBeforeBuildターゲット
<Target Name="BeforeBuild">
<Exec Command="notepad.exe Foo.txt" />
</Target>
3)「ビルド」ターゲットに「添付」(stijnが提案したように)
<Target Name="BeforeBuild2" BeforeTargets="Build">
<Exec Command="notepad.exe Foo.txt" />
</Target>
DependsOnTargetsがBeforeTargetsの前に実行されるため、実際にはこのソリューション(ビルドの場合)は機能しません。そして、DependsOnTargetsでは、実際に(CoreBuild)が存在します:)これが、彼らが 'BeforeBuild'ターゲットを発明した理由です;)
どちらの場合も、VSは何かが変更されているかどうかを確認します(ファイルは最新です)。何も変更されていないのに、なぜ外部プログラムを実行したいのですか?このプログラムがファイル(たとえば、「コンテンツ」)で機能する場合、msbuildとVSはファイルを古いものとして検出し、プロセスを構築します。
残念なことにIDE(Visual Studio)にはmsbuildプロジェクトを処理する独自のメソッドがあります。主なメカニズムは同じですが、どのプロジェクトをビルドするか、しないか、またはどの順序で決定するかです。 VSは全く異なる行為をします。
外部ツールを使用して、ソリューションまたはプロジェクトに対して「msbuild」を実行できます。これにより「適切な方法」でコンパイルされ、バイナリも変わりませんが、MsBuildのすべての機能と可能性が得られます。
Visual Studio for Macを使用した場合、これらのソリューションはどれも役に立ちません。プロジェクトをビルドする前にbashスクリプトを実行したいのですが、Xamarinを使用しているため、いくつかの問題が発生しています。さまざまな種類のターゲットをすべて試し、プロジェクトオプションでCustomCommandsを試しましたが、それでもMSbuildが自動的に実行されるか、ビルド前に実際に実行されないという問題が発生しました。
メインプロジェクトの前にコンパイルされる別のプロジェクトでPreBuildイベントを実行できます。
また、ここでは説明しなかった追加のビルド前イベントが1つあります。通常、コードアナライザーはそれを使用して、コードアナライザーがNuGetによってダウンロードされたかどうかを確認します。
したがって、コードアナライザーの前に何かを実行する場合は、そのターゲットを使用する必要があります。
.csprojファイルの<Target/>
ノードの下に<Project/>
ノードを追加するだけです。
<Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
<Exec Command="notepad.exe Foo.txt"/>
</Target>
PrepareForBuildイベントはbeforeビルド前イベントを実行します。