2010年5月14日 星期五

MVC 2.0 的建置與 TFS 2010

雖然與過往的 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.

參考

沒有留言:

Share with Facebook