一直想在 Linux 上使用 MONO 試試運行 Rafy,最近因為業務需要,總算是真正地試驗了一次。下麵是本次部署記錄的一些要點。 Linux 這次部署,我是和兩位同事一起來試驗的。由於我們對 Linux 都不太熟悉(多年前曾經用過很少一段時間的 RedHat,那些命令現在也早已忘記了,哈。),所...
一直想在 Linux 上使用 MONO 試試運行 Rafy,最近因為業務需要,總算是真正地試驗了一次。下麵是本次部署記錄的一些要點。
Linux
這次部署,我是和兩位同事一起來試驗的。由於我們對 Linux 都不太熟悉(多年前曾經用過很少一段時間的 RedHat,那些命令現在也早已忘記了,哈。),所以我們三個分別測試了三個不同的鏡像,最終選定了 OpenSUSE 的一個鏡像。(其實,我下載了一個Ubuntu,才 800M,安裝後老是有問題,不得不放棄,悲劇……)
相對於 Windows 來說,Linux 更輕量,安裝很簡單,安裝速度也非常快。
ASP.NET vNext vs MONO
這兩個是目前可行的 .NET 跨平臺方案。我們需要快速理解兩個方案,分析哪個方案的移植成本最低。
ASP.NET vNext
微軟本身已經逐步支持開源了,所以我們的想法自然是儘量先用微軟官方發佈的跨平臺方案。ASP.NET vNext(5) 目前已經發佈了 RC1。但是經測試,發現整個代碼構建於新的 API 之上,如果要把我們的程式移植到 vNext 之上,需要修改許多代碼。所以暫時還是沒有選擇使用 vNext,但是長期看來,必然還是需要選擇 VNext。
下麵是 vNext 官網和其文檔:
http://www.asp.net/vnext、https://docs.asp.net/en/latest/index.html
下麵是一些 vNext 相關的系列教程:
《解讀ASP.NET 5 & MVC6系列》、《ASP.NET 5系列教程》。
MONO
其實,目前來說,.NET 跨平臺,大家用的比較多的還是 MONO。官網:http://www.mono-project.com/
MONO 可簡單理解為跨平臺的 .NET 平臺,包括運行時、框架、工具。MONO 框架是 .NET 框架的重寫版本,其 API 儘量保持與 .NET 框架一致,也支持 CLI 規範,所以上層的應用程式不需要重新編譯,也可以直接運行在 MONO 上。所以直接使用 MONO 應該是成本最低的跨平臺方案。
但是,MONO 並不支持完整的 .NET,例如 WPF、WWF 就沒有在 MONO 上實現(詳見:《相容性對比》)。所以,我們可以使用一個工具來檢測應用程式是否會有相容性問題:“Mono Migration Analyzer”。
MONO 安裝完成後,對其進行了測試,可正確運行即可:
Web Server
在 Linux 在運行 MONO 可以使用 Apache、Nginx 等作為 Web 伺服器,見:《 MONO ASP.NET》、《mod_mono》。另外,國人編寫的 Jexus 伺服器也是比較流行的,對 .NET 支持非常好,用起來很簡單。所以我們選擇了最簡單的 Jexus 伺服器,降低學習的難度。
這裡遇到了一個問題,Jexus 伺服器使用的是 IIS 經典模式,導致網站 Web.config 中 <System.WebServer> 配置節不可用(該配置節用於 IIS 集成模式)。這裡,需要把該配置節中的內容都修改到 <System.Web> 中對應的配置節即可。
最終運行環境
Linux(OpenSUSE)+MONO+Jexus+MVC5+Rafy+Oracle。
在上述環境中,程式總算可以運行了。
不過還是發現了很多的相容性問題。比較多的情況是由於 Linux 是大小寫敏感的,而 Windows 並不敏感,所以程式中大量的文件在 Linux 上‘找不到’。另外,Windows 中的路徑分隔符是’\’,而 Linux 中是 ‘/’,也導致了一些問題。關於程式移植時考慮的內容,詳見:《Application Portability》。