如何在沒有安裝OpenAccess ORM的環境下編譯專案
鐵人賽的最後一篇,我們要來聊聊,如何在沒有安裝 OpenAccess ORM 的環境中,編譯專案,因為發行網站、部署組件都是開發的最後一關,做鐵人賽的收尾最恰當不過了。
有些專案,我們交付的程式,客戶會直接拿來部署使用,甚至部署也由我們處理,但有些公司,特別是自己有 IT、MIS 部門的公司,我們交付的程式,他們會有自己的版本控制系統,乃至於上線程式要自行編譯過才能部署,但問題是,這些客戶會這麼做,通常也表示他們有較高的安全性議題,所以想要他們在編譯環境下安裝第三方套件,通常很困難,那我們該如何處理呢?答案是把 OpenAccess 的建置外掛程式和相關組件整合起來即可。
首先,我們在一台沒有安裝 OpenAccess ORM 套件的環境下,開啟先前建立的 Web 專案,第一個先看到的是 NWModel.rlinq 檔案圖示變了,而且雙擊後不會進入視覺化編輯頁面,只會出現 XML 原始碼:
接下來我們建置專案,竟然沒有發生錯誤,編譯成功!那檢視網頁會成功嗎?答案是,不會:
上圖刻意把錯誤這行也抓下來讓大家看看。因為 *.rlinq 是 OpenAccess 專屬格式,所以雖然編譯沒有錯,但是卻無法從資源中取出。先看一下 NWModel.rlinq 預設的編譯行為:
透過 OpenAccessDeploy 來編譯,理所當然,這一定是有安裝 OpenAccess 才會有的編譯外掛程式,所以我們應該要先把這個編譯外掛和 OpenAccess 編譯及執行時期相關組件都收集起來,然後執行正確的編譯。首先,我們還是要找一台有安裝 OpenAccess ORM 的電腦(不然我們要到那去抓 OpenAccess 編譯外掛和相關組件),搜尋、取得下述檔案,放到專案的 bin 目錄下(也可以放在專案下的其他子目錄,不過我習慣讓 DLL 都在 bin 目錄下):
enhancer.exe
enhancer.exe.config
Mono.Cecil.dll
Mono.Cecil.Pdb.dll
OpenAccess.targets
Telerik.OpenAccess.dll
Telerik.OpenAccess.35.Extensions.dll
Telerik.OpenAccess.Config.dll
Telerik.OpenAccess.Runtime.dll
Telerik.OpenAccess.SDK.dll
Telerik.OpenAccess.Web.40.dll
Telerik.OpenAccess.Web.40.xml
venhance.exe
venhance.exe.config
然後記得關閉專案,最好連 VS2012 也關掉,然後用文字編輯器開啟專案的 vbproj 檔案,找到下述 XML 標籤,註解掉再加新的:
<!--<Import Condition="Exists('$(MSBuildExtensionsPath)\OpenAccess.targets')" Project="$(MSBuildExtensionsPath)\OpenAccess.targets" />-->
<Import Project="bin\OpenAccess.targets" />
請注意,若不是放在 bin 目錄下,要自行置換實際 OpenAccess.targets 的位置喔。
接著,再用文字編輯器開啟 OpenAccess.targets,找到 <PropertyGroup> 標籤的位置,把內容修改一下:
<PropertyGroup>
<UseOpenAccessTargets Condition="'$(UseOpenAccessTargets)'==''">true</UseOpenAccessTargets>
<OpenAccessPath Condition="'$(OpenAccessPath)'==''">bin</OpenAccessPath>
<EnhancerAssembly Condition="'$(EnhancerAssembly)'==''">enhancer.exe</EnhancerAssembly>
<ValidateMapping Condition="'$(ValidateMapping)'==''">false</ValidateMapping>
</PropertyGroup>
一樣是調整相關目錄位置。
接著我們開啟專案,把先前加入參考的 OpenAccess 相關組件移除參考,再重新加入,但這次請加入 bin 目錄下的 OpenAccess 組件。這麼做的原因是,目前我們是在有安裝 OpenAccess ORM 套件的電腦,所以 GAC 中會有 OpenAccess 組件,但是沒有安裝 OpenAccess ORM 套件的電腦中,當然 GAC 不會有這些組件,所以我們不能讓專案去抓 GAC,而是要改抓明確有 DLL 存在的位置,也就是 bin 目錄下:
接下來我們就可以執行編譯、檢視網頁,上述步驟都做正確的話,現在應該會順利看到網頁呈現的結果。接下來我們就可以把專案交付到沒有安裝 OpenAccess ORM 的電腦中,透過 NAnt 之類的工具,協助我們建置專案,並將網站發行出來。
請注意,發行的網站,bin 目錄下只會包含有加入參考且設定複製到本機為 True 的組件,所以發行後,請記得要把以下 DLL 複製到發行後的 bin 目錄中:
Telerik.OpenAccess.dll
Telerik.OpenAccess.35.Extensions.dll
Telerik.OpenAccess.Config.dll
Telerik.OpenAccess.Runtime.dll
Telerik.OpenAccess.Web.40.dll
另外請注意,Oracle Client 的相關組件(Oracle.DataAccess)還是必須存在於編譯電腦和 Web 伺服器的 GAC 喔,不然執行時期會無法和 Oracle 建立連線。
以下是在一台沒有安裝 OpenAccess ORM 的電腦中,透過上述的方式編譯專案後,發行網站、檢視網頁的效果: