Friday, December 5, 2008

實戰 - 將ASP.net的Web Site Project轉為Web Application Project

以下例子只適合MS Visual Studio.net 2005

最近因為工作關係,要將個做緊的Project從Web Site Projcet (唔駛compile)變成Web Application Project (WAP, 要compile)。其實,MSDN本身都有Web Site Project轉為Web Application Project的walkthrough,不過下面講的會係concern埋Source Control(用VSS)的問題。

因為根據Guideline,我係要先獨立地起一個新的Web Application Project先,再將Web Site Project D file再clone過去,再行conversion wizard。因此個source control 係convert完之後就因為當個Web Application Project係新Project,而會當D files 係新的,因此舊有的change history就會無左。

為避免這個情況,又唔見有現成的solution,我就唯有自行研究解決方法:

  1. 於VSS 拿最latest的full source,並確保每一個ASPX 的 code behind及App_Code folder內的class都係belongs to 一個正確的namespace (因為Web Site Project default係不用define namespace),如果不是的話就改到係為止。
  2. 改完code就 compile行下,看看有無問題。將改好了的file check in。
  3. 將整個Web Site Project 與及 Solution file check out 
  4. 關閉 VS.net
  5. Backup整個solution file
  6. Copy 一整套 solution 到另一個folder
  7. 用vs.net 開啟copy了出來的那一套solution,於VSS選項內unbind全部Project及solution
  8. Save and Exit VS.net
  9. 以Command prompt將Step 7的solution folder入面全部files 的attrib -r -h -s,並delete全部source control file (.scc, .vssscc)及excluded file (.exclude)
  10. 開返step 6個file,如出dialog問係咪唔做source control的話就選"是"
  11. 確保個solution去到呢個moment都行得
  12. 跟MSDN walkthrough做conversion,並確保App_Code folder經以改名,再於solution內delete整個Web Site Projcet。
  13. 試Build及試行個system,唔得改到得(記得include reference)
  14. 行得smooth後close個VS.net
  15. 以Explorer或其他方法,總之就不要在VS.net或VSS內,於有source control的那套solution內,delete Web Site Project 個folder內全部file 
  16. 將Step 13那個solution內的files copy 落於有source control的那套solution內原 Web site project 的那個folder內
  17. 改Solution file (見下文)
  18. 以VS.net開啟Merge好後的solution,這時,在solution explorer內該可見到個Web Site已轉了Web App,並可看見新加的designer.cs files
  19. 試Build及試行個system,唔得改到得(如果Step 13試好的話該無問題,否則可能copy漏file,這時就只好restore backup)
    -- Point of no return -- 
  20. Check In全部files,並關閉VS.net 
  21. 於VSS內該可看到有不少file個 status 仲係 Check Out,manually remove這些files
  22. 開返個Merge 好的solution,再get latest並在試Build及試行個system,如果有問題的話好大可能是App Code folder未被delete
  23. ~完~


改Solution file(.sln)
Solution file 是用作控制一個solution入面D Projects的relationship,setting及source control。
因為Web Site Project無csproj file 去store一些有關它自己的設定,因此我們在轉做Web Application後便要人手改動這個file,去通知個solution個Web Site Project已轉為一個Web Application Project。
建議找一些file comparision tools去幫幫手compare新舊兩邊project 的solution file,可事半工倍

  1. 1. 第一個difference該是一個以"Project"一字做頭的section,如在行Web Site Application的solution file會見到
    Project("{E24C65DC-7377-472B-9ABA-BC803B739999}") = "C:\...\Web\", "Web", "{63B50FD7-F0B7-4E2E-B4C8-B3AD4A3B9999}"
    Web Application 的是
    Project("{E24C65DC-7377-472B-9ABA-BC803B739999}") = "MyCompany.MyProject.Web", "Web\MyCompany.MyProject.csproj", "{6991311F-FDEA-4F4E-A776-CE835AA59999}"
    當要merge這段的時候,要更改"="後的那段string,最後的GUID其實就是Web Project的GUID;
    Debug/Release.AspNetCompiler* 的那幾行,新那邊無的話可直接移走舊solution的那幾行
  2. 第二個difference該是下列的一段
    SccWebProject[n] = true
    SccProjectUniqueName[n] = Web
    SccLocalPath[n] = .
    SccProjectFilePathRelativizedFromConnection[n] = Web\\
    SccProjectEnlistmentChoice[n] = 2

    [n]是一個數字
    在舊Solution中可移走下列兩行
    SccWebProject[n] = true
    SccProjectEnlistmentChoice[n] = 2

    並將SccProjectUniqueName 改做跟新Solution file的那個"......Web.csproj"
  3. 第三個difference該是下列的一段
    GlobalSection(ProjectConfigurationPlatforms) = postSolution
    {63B50FD7-F0B7-4E2E-B4C8-B3AD4A3B9999}.Debug|.NET.ActiveCfg = Debug|.NET
    {63B50FD7-F0B7-4E2E-B4C8-B3AD4A3B9999}.Debug|.NET.Build.0 = Debug|.NET
    {63B50FD7-F0B7-4E2E-B4C8-B3AD4A3B9999}.Debug|Any CPU.ActiveCfg = Debug|.NET
    ...
    EndGlobalSection

    將整段setting由新solution copy 入舊solution 
  4. Save
當然,上述方法是否一個好方法,和是否一個for all case的方法,其實我都唔知,如果大家試過有甚麼好的solution,歡迎留言分享一下~ 


No comments: