33

私のプロジェクトでは、いくつかのバイナリ ファイルを更新するために外部ツールを実行しています。これらのファイルは「コンテンツ」としてプロジェクトに含まれます。

現時点では、ツールは C# プロジェクト プロパティの「ビルド前イベント」中に実行するように設定されています。残念ながら、このイベントはプロジェクトが古くなっている場合にのみ実行されます。これは私が必要としているものではありません。

プロジェクトで常に「ビルド」ではなく「リビルド」を使用してこの問題を回避していますが、これは面倒で時間がかかります。

プロジェクトが最新かどうかに関係なく、このツールを常に実行する必要があります。実際には、MSBuild がプロジェクトが最新かどうかを判断する前に、ツールがプロジェクトに含まれるファイルの一部を変更し、最新のチェック結果に影響を与えるためです。

それを行う適切な方法はありますか?

4

5 に答える 5

53

これが解決策です。プロジェクト ファイルで次のプロパティを定義します。

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup> 

PreBuildStep は、プロジェクトが最新かどうかに関係なく、毎回実行されます。

Visual Studio は、MSBuild の通常の最新のチェックをバイパスし、より高速な何らかのカスタム チェックを使用しているようですが、カスタマイズされたビルド ターゲットを壊すという副作用があります。

于 2015-03-14T14:50:54.080 に答える
10

プロジェクト レベルでは、次の 3 つのオプションがあります。

1) ビルド前のアクション

<PropertyGroup>
  <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>

2) 通常の BeforeBuild ターゲット

<Target Name="BeforeBuild">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

3)「Build」ターゲットに「接続」(stijnが提案したように)

<Target Name="BeforeBuild2" BeforeTargets="Build">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

DependsOnTargetsBeforeTargetsの前に実行されるため、実際にはこのソリューション (ビルドの場合) は機能しません。そして、まさに DependsOnTargets に実際の (CoreBuild) が置かれています :) これが、彼らが「BeforeBuild」ターゲットを考案した理由です ;)


どちらの場合も、VS は何かが変更されているかどうかを確認します (ファイルは最新です)。何も変更されていないのに、なぜ外部プログラムを実行したいのですか? このプログラムがファイル (例: "コンテンツ") で動作する場合、msbuild と VS はファイルを古いものとして検出し、ビルドを処理する必要があります。


残念ながら、IDE (Visual Studio) には、msbuild プロジェクトを処理するための独自の方法があります。主なメカニズムは同じですが、どのプロジェクトをビルドするか、またはどの順序でビルドするかを決定するときは、VS の動作がまったく異なります。

外部ツールを使用して、ソリューションまたはプロジェクトに対して "msbuild" を実行できます。これも「適切な方法」でコンパイルされ、バイナリは同じですが、MsBuild のすべての機能と可能性を利用できます。

于 2015-03-09T17:01:42.523 に答える