雖然與過往的 WebForm 差異甚大,但在使用 MVC 2.0 來建立網站仍是一個美好的經驗。
更佳者,是內建了 MvcBuildViews 的功能。
MvcBuildViews
以往在建置Asp.net WebForm 網站時,Web Application 的編譯並不包含 aspx的部份。換句話說,WebApplication可在 Visual Studio 編譯成功,但在 aspx 上的語法如果有錯誤的話,只有該網頁在執行時期才會發現錯誤。
asp.net 有個 PreCompile 的機制,可以提早發現這類的錯誤。但並沒有整合到開發環境中,總是要等到上線時才被客戶踩到地雷後,才怪微軟怎麼 compile 會過。
因此,在 asp.net MVC 中,增加了 MvcBuildViews 的機制。也就是在編譯時期提早編譯 View 的部份。
這個選項預設是 false。必須以 xml 的方式打開 .csproj,找到 MvcBuildViews,將其值改為 true,才會編譯 View。
<Project ...> ... <MvcBuildViews>true</MvcBuildViews>
其實這裡的作業方式仍然是作 asp.net 的 precompile。見 .csproj 最下方有個 build target,引導 MSBuild 在 Compile 完畢後接著再執行 aspnet_compile。
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)" /> </Target>
TFS 2010
導入 TFS 2010後,上述的 MvcBuildViews 的選項會導致 Build Machine 編譯失敗。失敗的錯誤訊息如下
/temp/global.asax (1): Could not load type 'XXX.MvcApplication'.
原因呢?我認為MVC 的MvcBuildViews的設計僅就開發人員在 Desktop 上能進行編譯即可,故把 Project 的路徑等同於Build的路徑。而TFS在編譯時,並非將專案的路徑當成編譯的輸出路徑,故$(ProjectDir) 的值並非完整編譯後的可執行環境。
因此,我們必須針對該 .csproj 進行修改。修改 csproj 時必須顧慮到開發人員及 TFS 的 Build machine 同時可以編譯的需求,我作了下面的改變。
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> </Target> 也就是改變 $(ProjectDir) 為 $(WebProjectOutputDir)。
MVCContrib
在使用了 MVCContrib 的元件後,上述的 Team Build 又失敗了。錯誤訊息如下
c:\Builds\1\…\PublishedWebsites\xxx\Web.config (114): The type or namespace name 'MvcContrib' could not be found (are you missing a using directive or an assembly reference?)
我在MVC 網站所參考的 MVCContrib.dll 竟不見了。不知為何?原來,我忘了將MVCContrib.dll加入Source Control 中了。到了 Build Server 找不到該dll.
參考
沒有留言:
張貼留言