14

デフォルトのターゲットが「BuildWithExternalReference」と同様の名前の新しいターゲットになるように、MSBuildプロジェクトをカスタマイズしました。この新しいターゲットは、他の2つのターゲットを呼び出します。1つ目は、外部ツールを使用してDLLをビルドする「BuildExternalReference」のようなカスタムターゲットです。ビルドされるDLLは、通常の「ビルド」ターゲットを使用してビルドされるメインプロジェクトの参照です。'BuildExternalReference'ターゲットの入力属性と出力属性を設定したので、入力はソースファイルを参照し、出力は結果のDLLを参照します。

VisualStudio2012とVisualStudio2010の両方で、ビルドは最初に呼び出されたときに正しく機能します。ただし、後続のビルドで外部ソースファイル(「BuildExternalReference」ターゲット入力属性によって参照される)を変更すると、Visual Studio 2012は単に「ビルド:0成功、0失敗、1最新、0スキップ」と報告します。VisualStudio2010は引き続き完全に機能します。さらに、MSBuild.exeを使用したコマンドラインからのビルドは完全に機能します。

Visual Studio 2012のビルドシステムが変更されたことは承知していますが、インクリメンタルビルドの実行方法の変更に関する情報が見つかりません。

Visual Studio 2012で、インクリメンタルビルドを変更するために何か変更がありましたか?

これが私が使用しているcsprojファイルの縮小版です:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="BuildWithExternalTool" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ExternalSourceFiles Include="..\ExternalSourceFiles\\*\*.cs" />
    <ExternalDll Include="..\ExternalSource\External.dll" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Target Name="BuildExternalTool" Inputs="@(ExternalSourceFiles);" Outputs="@(ExternalDll)">
    <Exec Command="C:\External\Path\To\Tool.exe" />
  </Target>
  <Target Name="BuildWithExternalTool">
    <CallTarget Targets="BuildExternalTool" />
    <CallTarget Targets="Build" />
  </Target>
</Project>

2012年11月1日更新

これは、問題を再現する完全な自己完結型の例です。

https://skydrive.live.com/redir?resid=EA1DD6ACA92F9EFF!155&authkey=!ANhuqF_rrCgxpLE

これは、1つのプロジェクトによるソリューションです。MSBuildIssueExample \ MSBuildIssueExample.csprojファイルがカスタマイズされているため、カスタムのデフォルトターゲットがあります。このデフォルトのターゲットは、カスタムターゲット(「ExternalTool」と呼ばれます)を呼び出してから、デフォルトのビルドターゲットを呼び出します。

カスタムExternalToolターゲットは、動作を確認するためにいくつかのメッセージを書き出し、MSBuildIssueExample \ ExternalTool\Input.txtファイルの内容をMSBuildIssueExample\ExternalTool\Output.txtファイルにコピーします。

Input.txtファイルはExternalToolターゲットの入力であり、Output.txtは出力です。

問題を再現するには、次の手順に従います。

1)指定されたバージョンのVisualStudioでソリューションを開きます

2)ソリューションを一度構築して、出力が入力に対して最新であることを確認します

3)MSBuildIssueExample \ ExternalTool \ Input.txtを変更して、その内容がOutput.txtと一致しないようにします。

4)再構築

Visual Studio 2010でこのプロセスを実行すると、ExternalToolターゲットが再度呼び出され、Input.txtファイルがOutput.txtにコピーされます。

Visual Studio 2012でこのプロセスを実行すると、入力が出力よりも新しい場合でも、ExternalToolターゲットは呼び出されません。その結果、Input.txtの内容はOutput.txtに書き込まれません。

ただし、(ビルドだけでなく)再ビルドを実行すると、両方のバージョンのVisualStudioが期待どおりに機能します。

4

3 に答える 3

13

Microsoft からのこのフィードバックは、次の質問に答えます。

「これは、VS 2012 の変更によるもので、C#/VB プロジェクトは、常にビルドを強制するのではなく、ビルドをスキップできるようにする「高速最新チェック」を行うようになりました。ただし、1 つの欠点はその高速更新チェックではカスタム ターゲットが考慮されないため、増分変更が検出されませんでした。「高速更新チェック」を無効にする場合は、「DISABLEFASTUPTODATECHECK」を true に設定してください。プロジェクト ファイルの MSBuild プロパティ、または VS を起動する環境の環境変数として。」

http://connect.microsoft.com/VisualStudio/feedback/details/770784/visual-studio-2012-msbuild-incremental-build-not-detecting-changes#details

したがって、基本的にこれは Visual Studio 2012 の重大な変更であり、残念ながら十分に文書化されていないようです。

于 2012-11-16T10:25:03.033 に答える