web-dev-qa-db-ja.com

MS14-059以降、System.Web.MVCはbinフォルダーにコピーされません。 Windows Updateの結果としてDLLが欠落しているビルドの作成を防ぐ方法は?

今朝、QAサーバー上のWebアプリが完全に壊れていることが報告されました。Web.configから次のエラーが報告されました。

ファイルまたはアセンブリ 'System.Web.Mvc、Version = 5.1.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません

MVCについて言及したWindows Updateを見て、いくつか掘り下げたところ、 lotsofpeoplereporting 最近のWindowsが見つかりました壊れたMVCを更新します。

これらの質問と私たちのサーバーをよく調べたところ、私たちを噛んだことが他の質問の内容と一致していないようですが、関連しているように見えます。これが私たちが知っていると思うことです:

  • 壊れたアプリはASP.NET MVC 5.1を使用しています
  • MVCはNuGetを介してインストールされました
  • BuildServerおよびQAサーバーにはMVC 5.1がインストールされていません(したがって、GACは行われていません)。

私たちが壊れていると私たちが信じているのは、「不良ビルド」が作成された原因です。

  • MVC 5.1のパッチがWindows Update経由でBuildServerにインストールされましたにもかかわらず、GACにMVC 5.1がインストールされていません
  • パッチは、GACにMVC 5.1の「更新された」バージョンを配置しました
  • DLLがGACにある場合、CopyLocal = trueは無視されます。したがって、パッチ以降、BuildServerからのアプリのビルドにはシステムがなくなります出力フォルダの.Web.MVC
  • System.Web.MVCがQAサーバーのGACにない(まだパッチが適用されていない)ため、System.Web.MVCが見つからないため、アプリケーションは失敗します。

上記の動作が正しいと仮定すると、これは、MSがいつでもGACにないNuGet DLL Windows Updateを介して)をサービスすることを意味します 、BuildServerは不完全なビルドの作成を開始します(GACに挿入されたDLLがありません)。

MVC 5.2にアップグレードすると、この問題が解決されます(パッチが適用されなかったため、GACに挿入されなかった可能性があります)。 DLLが出力フォルダーにコピーされます。バージョン番号の変更を除いて、5.2.2にアップグレードされたdiffには変更がありません(具体的には<Private>ノードが追加/編集されました)。

すべてのGAC処理を開始したり、MSがそれらにパッチを適用した場合に備えて、すべてのDLLをbinフォルダーにコピーする手動のビルドステップを作成したりしたくありません。

では、MSが将来他のDLLにパッチを適用した場合に、BuildServerがサイレントに不良ビルドを生成しないようにするために、今日今日を変更するにはどうすればよいでしょうか?

36
Danny Tuppeny

MVC 5.1のパッチがGACにMVC 5.1がインストールされていないにもかかわらず、Windows Updateを介してBuildServerにインストールされました

はい、この動作は実際には仕様によるものです。 http://blogs.msdn.com/b/dotnet/archive/2014/01/22/net-4-5-1-supports-Microsoft-security-updates-for-net-nuget-librariesを参照してください。 .aspx


パッチは、GACにMVC 5.1の「更新された」バージョンを配置しました

それは正解です;これは、更新プログラムが古いコードの代わりに更新されたコードを実行する方法です。 https://technet.Microsoft.com/en-us/library/security/ms14-059 を参照してください。


DLLがGACにある場合、CopyLocal = trueは無視されます。したがって、パッチ以降、BuildServerからのアプリのビルドでは、出力フォルダーにSystem.Web.MVCがなくなります。

ではない正確に。実際に発生するのは、以前はCopyLocal = trueであったプロジェクトがCopyLocal = falseに切り替えられることです。 CopyLocalは次の2つの方法のいずれかで設定できます。1).csprojファイルに明示的な<Private>True</Private>設定がある場合、または2)デフォルトでそのような設定が存在しない場合(GACのアセンブリはデフォルトでCopyLocalを使用しません)。他のアセンブリは行います)。

したがって、この場合に起こったように見えるのは、プロジェクトファイルのcsprojファイルにこの設定がなかったということです。その結果、GUIはパッチの前に評価されたデフォルト値に基づいて設定を表示しましたが(CopyLocal = true)、パッチがインストールされた後、GUIはGACされたアセンブリの新しいデフォルト値を表示します(CopyLocal = false) )。


System.Web.MVCがQAサーバーのGACにない(まだパッチが適用されていない)ため、System.Web.MVCが見つからないため、アプリケーションは失敗します。

そのとおりです。


上記の動作が正しいと仮定すると、これは、MSがGACにないNuGet DLL Windows Updateを介してサービスを提供するたびに、BuildServerが不完全なビルドの生成を開始することを意味しますGACに挿入されたDLL)。

明示的な<Private>True</Private>設定のない.csproj参照の場合、それは正しいです。また、NuGetを使用してMVC参照を更新すると、以前に存在していた場合でもこの設定を削除できることに注意してください。 http://nuget.codeplex.com/workitem/4344 を参照してください。


MVC 5.2にアップグレードすると、この問題が解決されます(パッチが適用されなかったため、GACに挿入されなかった可能性があります)。 DLLが出力フォルダーにコピーされます。バージョン番号の変更を除いて、5.2.2にアップグレードされたdiffには変更がありません(具体的には、ノードが追加/編集されていません)。

そのとおりです。 MVC 5.2はGAC化されていないため、明示的な<Private>True</Private>設定がなくても、この非GAC化アセンブリのデフォルト値はCopyLocal = trueになります。


すべてのGAC処理を開始したり、MSがそれらにパッチを適用した場合に備えて、すべてのDLLをbinフォルダーにコピーするための手動ビルドステップを作成したりしたくありません。では、MSが将来他のDLLにパッチを適用した場合に、BuildServerがサイレントに不良ビルドを生成しないようにするために、今日何を変更できるでしょうか。

今日できることは次のとおりです。

  1. すべてのNuGetパッケージアセンブリ参照について、明示的な<Private>True</Private>設定を.csprojファイルに配置します。
  2. NuGetバグ#4344が修正されるまで、NuGetを使用してパッケージ参照を更新するときはいつでも、.csprojファイルに戻って、明示的な<Private>True</Private>設定を再度追加してください。
14
dmatson

この問題は.Net Web開発ツールとUIのブログで対処されていると思います: link

問題と解決策はそのリンクでかなりよく説明されているので、ここではすべてを繰り返すことはしません。

ただし、これがなぜ起こったのかを説明する重要なポイントを繰り返すだけです。

  • パッチの一部として KB2994397 MVC 5.1がGACに追加されました。

  • CopyLocalフラグをリセットするNuGetバグがあるようです。 ( link を参照)これは、上記のパッチが適用されたマシンがパッチが適用されていないマシンにデプロイされると、壊れることを意味します!

  • MVC 4のアセンブリバージョン番号は、同じセキュリティ更新プログラムMS14-059(GACバージョンは使用されません)によって増加しています。これは、GACにあるにもかかわらず、MVC 4バージョンが引き続き機能する理由を説明しています。

5
James S