前言html
開始前端
Asp.net 發佈分爲:動態編譯和預編譯。預編譯又分爲:In Place Pre-compilation 和 Pre-compilation for Deployment。關於asp.net編譯,推薦Artech寫的:瀏覽器
深刻剖析ASP.NET的編譯原理之一:動態編譯(Dynamical Compilation)服務器
深刻剖析ASP.NET的編譯原理之二:預編譯(Precompilation)前端工程師
本文講述的編譯都是預編譯中Pre-compilation for Deployment的Updatable Pre-compilation。如圖所示:mvc
來到新公司的這段時間,常常聽到同事們抱怨:只是改了幾個頁面,每次都要將整個網站發佈一遍,而後從上百個文件中仔細的挑選本身改的那幾個頁面。app
仔細想一想,之前開發的網站都是客戶定製的,網站一交付,基本就不會再修修改改了,或者根本就不發佈網站,直接把源碼放到IIS中,故不會頻繁發佈網站。asp.net
來到新公司以後,開發的是公司本身的在線產品,常常須要對網站升級、修改,於是需頻繁的發佈網站。
對須要頻繁發佈網站的團隊來講,vs自帶的發佈網站工具,帶來的痛苦有:
a、每次需整個發佈一遍,特別耗時間。頁面越多,預編譯就越慢。
b、須要仔細挑出本身修改過的aspx頁面和bin下對應的dll文件。一樣是:頁面越多,越不容易找到,特別是dll。
據說博客園博客程序中.aspx和.ascx文件總共加起來有3000多個,使用fixednames編譯須要30分鐘,呵呵~~
那怎麼辦呢?
如下提供兩種解決方法:
將全部的aspx.cs文件集中放到同一類庫項目下,意味着你攬了ASP.NET預編譯的活。也就是說預編譯給每一個頁面生成的代碼,你須要本身手寫。
先來對比一下正常發佈,頁面文件內容的變化:
Web.config設置:
Default.aspx:
發佈前:
發佈後:
Default.aspx.cs:
發佈前:
發佈後(用.Net Reflector打開bin目錄下對應的dll):
因而可知,預編譯作的工做:
Demo:
點擊登陸è
總結
優勢:
缺點:
當我修改了a.aspx.cs,b.aspx.cs也被別人修改時或者尚未被簽入,我沒有獲取最新版本,而後就把類庫編譯成的dll,更新到服務器上從
而會出現問題,更偏好Asp.net預編譯生成的一個頁面對應一個dll的方式,只發布本身改的文件,將影響面積降到最低。
我的以爲這個缺點的理由不夠充分,既然要發佈,那就必須保證你編譯的全部代碼版本不該該比服務器上的版本低,
若是這個保證不了,那怎麼能保證頁面引用的其餘dll是最新的呢,並且若是照上述邏輯,
asp.net mvc豈不是也有這種狀況?給每一個cs都單獨生成一個dll豈不更好?
故而認爲,無論哪一種方式都有覆蓋他人代碼的風險,只是這種方式風險稍微大些。
aspx.cs文件放到單獨的類庫項目實際上是一種變通的方法,本質上並無解決vs自帶的發佈網站工具每次都要預編譯整個網站的缺陷。那隻能本身開發個插件了。
詳細介紹: