web-dev-qa-db-ja.com

msbuild.exeは開いたままで、ファイルをロックします

次に、msbuild(.NET 4)を呼び出すTeamCityを使用します。ビルドが完了した後(ビルドが成功したかどうかは問題ではないようです)、msbuild.exeが開いたままで、TeamCityが試行するたびにファイルの1つをロックするという奇妙な問題があります作業ディレクトリをクリアするには失敗し、続行できません。

これは毎回almost発生します。

私はこれに本当に失望しているので、できるだけ多くの詳細を提供しようとします。

  • サーバーは、Intel Core i7、2 GB RAM、Windows Server 2008標準64ビットSP2です。
  • TeamCityでは、msbuildランナーは/mコマンドラインパラメーターで構成されます(複数のコアを使用することを意味します)
  • 問題のファイルは[〜#〜] always [〜#〜]同じ外部DLLパスの.NETプロジェクトの1つで参照されていますExternal Tools\Telerik\Telerik.Reporting.Dll。(同様のパス構造でExternal Tools dirに含まれる他のいくつかの.DLLファイルがこの問題を引き起こすことはありません。)現在、これはTelerikレポートの試用版で、違い。
  • 問題が発生すると、タスクマネージャーには常にいくつかのmsbuild.exe *32プロセスがリストされます。7があると考えられます。ProcessExplorerを使用すると、それらはすべて最上位プロセス(親なし)のように見えます。彼らはすべて20-50MBのRAMと0.0%のCPUを使用しています。
  • 1〜3分待つと、msbuild.exeプロセスは自動的に終了し、TeamCityは作業ディレクトリを適切に更新できます。
  • Msbuildプロセスを手動で終了すると、TeamCityの更新はすぐに再び機能します。
  • Windowsでは、インデックスサービスはオフになっています(ただし、前の2つのポイントでは、msbuild.exeが問題の原因であることを確認しています)。
  • Telerik.reporting.dllには特別なプロパティはありません。 SVNプロパティはsvn:mime-type = application/octet-streamのみです

誰もこれに出くわしたことがありますか?

89
gregmac

/nr:falsemsbuildを使用します。

簡単に説明すると、MSBuildは、特に並列ビルドの場合、高速化するために多くのことを試みます。多くの「ノード」を生成します-プロジェクトをコンパイルできる個々のmsbuild.exeプロセス。プロセスの起動には少し時間がかかるため、ビルドが完了すると、これらのプロセスがハングアップします(デフォルトでは15分間、 )、すぐに再びビルドする場合、これらのノードを「再利用」して、プロセスのセットアップコストを節約できます。ただし、前述のコマンドラインオプションでnodeReuseをオフにすることで、この動作を無効にすることができます。

こちらもご覧ください:

116
Brian

Visual Studio内でノードの再利用を無効にするには、環境変数を使用する必要があります。

MSBUILDDISABLENODEREUSE=1
39
dan