web-dev-qa-db-ja.com

VS2012ビルド後のイベントが発生しない

ビルド後のイベント「ビルドが成功しました」を起動して、クリーンアップ/移行アクティビティ(コマンドスクリプト)を実行するWebプロジェクトがあります。

VS2012では、成功時のビルド後は、コードが変更された場合にのみ起動します。コードの変更がない場合でも、コンパイラはビルドの成功を報告しますが、ビルドが成功すると、ビルド後のイベントは発生しません。

VS2010では、コードの変更に関係なく、ビルドが成功するたびにビルド後のイベントが発生します。これは私が期待することです。変更が発生していなくてもコンパイルは成功したため、イベントが発生するはずです。

コードを変更したVS2012ビルドの例:

------ Build started: Project: ABC.Business.Web.Migrate, Configuration: Debug Any CPU ------
Build started 2012-08-23 01:26:13.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702,2008 /nostdlib+ /errorreport:Prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva- /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll" /reference:C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll" /debug+ /debug:full /optimize- /out:obj\Debug\ABC.Web.Migrate.dll /target:library /utf8output Properties\AssemblyInfo.cs "C:\Users\Administrator\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cs"
_CopyFilesMarkedCopyLocal:
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll" to "bin\ABC.Business.Web.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Web.dll" to "bin\ABC.Web.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC._Services.dll" to "bin\ABC._Services.dll".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.pdb" to "bin\ABC.Business.Web.pdb".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Web.pdb" to "bin\ABC.Web.pdb".
  Copying file from "C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC._Services.pdb" to "bin\ABC._Services.pdb".
CopyFilesToOutputDirectory:
  Copying file from "obj\Debug\ABC.Web.Migrate.dll" to "bin\ABC.Web.Migrate.dll".
  ABC.Business.Web.Migrate -> C:\Dev\ABC\Source\ABC.Business.Web.Migrate\bin\ABC.Web.Migrate.dll
  Copying file from "obj\Debug\ABC.Web.Migrate.pdb" to "bin\ABC.Web.Migrate.pdb".
PostBuildEvent:
  "C:\Dev\bin\spawn.exe" "C:\Dev\ABC\Scripts\Migrate Business Web.bat"

Build succeeded.

Time Elapsed 00:00:00.34
========== Build: 4 succeeded, 0 failed, 53 up-to-date, 0 skipped ==========

コード変更なしのVS2012ビルドの例:

------ Build started: Project: ABC.Business.Web, Configuration: Debug Any CPU ------
Build started 2012-08-23 01:36:04.
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
CopyFilesToOutputDirectory:
  ABC.Business.Web -> C:\Dev\ABC\Source\ABC.Business.Web\bin\ABC.Business.Web.dll

Build succeeded.

Time Elapsed 00:00:00.31
========== Build: 1 succeeded, 0 failed, 56 up-to-date, 0 skipped ==========

VS2012でビルド後のイベント「Always」を使ってみました。コードが変更された場合にのみ、Always post-buildイベントが発生します(Onsuccessと同じ)。私の唯一の回避策は、再構築を行うことでした-依存するプロジェクトが数十ある場合は苦痛です!または、手動でスクリプトを実行します-これも面倒です! (いいえ、それは私のスクリプトではありません-最初の例が示すように、コードが変更された場合、このスクリプトは完全に正常に機能します!)

これは意図的な変更またはバグのいずれかです。

他の誰かがVS2012でこのビルド後の問題を経験しましたか?

19
Grant

私は同じ問題を抱えていて、次のように解決しました。

  • ダミーの空のtxtファイルをプロジェクトに追加します。
  • プロパティ「ビルドアクション」:コンテンツ。
  • プロパティ「出力ディレクトリにコピー」:常に。

つまり、プロジェクトが最新であるか、スタートアッププロジェクトでなくても、常にdePOST-BUILDステップを実行します。

enter image description here

30
Jorge L. Fatta

私は同様の問題を抱えていました、そしてこれは私を助けました:

ツール...オプション...プロジェクトとソリューション...ビルドと実行...

「スタートアッププロジェクトと実行時の依存関係のみをビルドする」のチェックを外します

ここで提案されているように: Visual Studioでの実行時(F5)のビルド後のイベント?

3
lloyd christmas

私にとっては、 この回答 が必要でした。これは、バッチファイルを呼び出す場合は、次を使用することを示しています。

CALL mybatch
CALL anothercommand

コマンドを直接使用する代わりに:

mybatch
anothercommand

mybatchが使用されていない場合は、CALLのみが呼び出されます。

1
noelicus

$(MSBuildToolsPath)\Microsoft.CSharp.targetsのインポート前にPostBuildEventプロパティが定義されていると、ビルド後のイベントが正しく実行されない場合があります。 <PropertyGroup>ビルド後のイベントの定義は、このファイルのインポート後です。

正しくないmsbuildファイルの例:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <!-- Snip -->
  <!-- DO NOT USE, INCORRECT ORDERING OF IMPORT -->
  <PropertyGroup>
    <PostBuildEvent>echo $(TargetName)</PostBuildEvent>
  </PropertyGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

正しいmsbuildファイルの例:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <!-- Snip -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <PropertyGroup>
    <PostBuildEvent>echo $(TargetName)</PostBuildEvent>
  </PropertyGroup>
</Project>
0
Mitch