内容
自分が経験したASP.NET MVCアプリケーションの配置トラブルを元に解決方法や、プロジェクトテンプレートのまま開発するよりもNuGetを使う方がいい理由をまとめた。
トラブル
ASP.NET MVC 3で作成したアプリケーションが客先環境で動作しなかった。
自マシン、自社環境、客先担当者PCでは動作確認は行っていた。
原因
発行したサイトに必要なDLLが含まれていなかった。(binフォルダにアプリケーションのDLLのみがある状態)
最終的に必要だったDLLは下記の通り。
- Microsoft.Web.Infrastructure.dll
- System.Web.Helpers.dll
- System.Web.Mvc.dll
- System.Web.Razor.dll
- System.Web.WebPages.Deployment.dll
- System.Web.WebPages.dll
- System.Web.WebPages.Razor.dll
解決するためにやったこと1
- 参照設定のプロパティにあるローカルコピーを全てTrueにし、ビルド時にbinフォルダに出力されるようにした。
- 参照設定に表示されないDLL(Microsoft.Web.Infrastructure.dll、System.Web.WebPages.Razor.dll)は「C:\Program Files (x86)\Microsoft ASP.NET」配下のDLLを追加した。
- この作業をしながらSystem.Web.Mvc(C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies)のバージョンがいつの間にか3.0.0.1に変わっていたことに気がついたのでWeb.config内の表記を更新した。
解決するためにやったこと1の結果
結果的には動作しなかった。エラーの内容はSystem.Web.Mvcのバージョン3.0.0.0が見つからない、という内容だった。
解決するためにやったこと1の結果を受けて考えたこと
- 3.0.0.0の表記がないのにも関わらず探しているということは、依存関係が崩れ依存先が探しているのだろうと予想した。
- そんな中このような記事を見つけた。
- Mvc.dll のバージョン相違
解決するためにやったこと2
- 上記URLの内容を参考に参照設定をやり直した。
解決するためにやったこと2の結果
エラーの内容は変わらず、動作しなかった。
解決するためにやったこと2の結果を受けて考えたこと
- Visual Studio 2010のテンプレートから作成した時点でMVC関係の参照が設定されたが、上記URLにあるパッチでSystem.Web.Mvcのみが更新され、依存関係が壊れているのだろうと予想した。
- 解決策が見つからず途方に暮れた。
- そんな中このような記事を見つけた。
- Issue with ASP.NET MVC Version 3.0.0.1. Security Update and How to Fix it
- 記事を感じ取ると、MVCはNuGetを使って突っ込みなさいよ、という内容に感じた。
解決するためにやったこと3
- パッケージマネージャーから下記のコマンドを実行しMVCのパッケージをインストールした。
Install-Package Microsoft.AspNet.Mvc -Version 3.0.50813.1
- ASP.NET MVC 3 3.0.50813.1
解決するためにやったこと3の結果
- 全ての必要なDLLがbinフォルダに出力され無事動作した。
- パッケージフォルダに下記のフォルダが作成され、参照がその中のDLLに設定されローカルコピーがTrueに設定された。
- Microsoft.AspNet.Mvc.3.0.50813.1
- Microsoft.AspNet.Razor.1.0.20105.408
- Microsoft.AspNet.WebPages.1.0.20105.408
- Microsoft.Web.Infrastructure.1.0.0.0
- パッケージ内のSystem.Web.Mvcは3.0.0.1となっており、NuGetが依存関係を解決してくれて他のDLLも正しくインストールされたようだ。
今回学んだこと
- ASP.NET MVC(に限らないかもしれないが)のアプリケーションはテンプレートから作成したまま使うのでなく、NuGetを使用してパッケージをインストールしなおす方がパッチ等の影響を受けることがないので幸せになれると思った。
- 開発環境の動作確認で満足せず、限りなく本番環境に近い環境で早めに動作確認を行ったほうがよい。
- 上記手順を何度でも思い切りやらせてくれるVCSはやはり素晴らしい。