前言
Mono的前東家Novell公司旗下的SUSE Linux系列對Mono及MonoDevelop提供內置支持,所以在SUSE/OpenSUSE這些Linux系統中安裝MonoDevelop是非常簡便的。但是,在其他Linux分支中要安裝MonoDevelop卻常常需要大費周折,為什么會這樣呢?主要問題出在.NET對Gnome/gtk庫的封裝上,在安裝MonoDevelop時,最常見的問題便是提示glib-sharp或者gnome-sharp等依賴組件不存在。其實要解決這些依賴問題不難,但在Linux中玩MonoDevelop的家伙基本都是.NET開發人員 ——你懂的,.NET開發人員往往對Linux知之甚少……
CentOS/RHEL肯定是用來做服務器的,既然這樣何必還要裝個MonoDevelop呢?——直接在Visual Studio中調試好再把程序集部署到CentOS上就好了。話雖這么說,但是Mono與.NET類庫的很多實現還是有較大差別的(譬如:TypeDescriptor、Socket、Type.GetType(...)等,以后再另寫文章來講這些差別。),再加上Linux與Windows環境的巨大差異,這些都會導致我們的.NET程序在.NET on Windows上是正常的,但是放到Mono on Linux中運行卻會出現各種古怪問題。平台兼容確實是個讓人頭痛的事情!
所以,在CentOS/RHEL開發機中裝個MonoDevelop是非常必要的。當然,如果怕麻煩的話直接安裝OpenSUSE會簡單很多,但是,我一直受不了各種所謂面向普通用戶的Linux分支版本,那些西施效顰般的界面和操作方式真心讓人蛋疼,再加之希望開發與最終部署服務器的Linux分支相同以免不必要的再測試。
安裝過程
首先,必須確保Mono安裝成功(純屬廢話)。然后再執行下列命令來安裝gtk-sharp:
# cd /usr/local/src
# wget http://download.mono-project.com/sources/gtk-sharp212/gtk-sharp-2.12.21.tar.gz
# tar -zxvf gtk-sharp-2.12.21.tar.gz
# cd gtk-sharp-2.12.21
# ./configure --prefix=/usr
# make && make install
很遺憾,在上面的configure命令中,你會得到這樣一個錯誤提示:
/bin/sh: /usr/bin/gapi2-codegen: /bin/sh^M: bad interpreter: 沒有那個文件或目錄
這個提示很讓人崩潰,為什么呢?因為你去/usr/bin下面找,發現的確有個gapi2-codegen文件,這個文件明明在啊,為什么說沒有呢?!這是因為這個腳本文件格式問題所導致的,真是坑爹的源碼包啊。好吧,那就用vim打開那個文件進行格式轉換吧:
# vim /usr/bin/gapi2-codegen
然后在vim里面輸入(包括前面冒號):
:set ff?
如果你在vim中執行上述命令后,提示你的是 fileformat=DOS的話,那么請接着在vim中使用下列命令:
:set fileformat=unix
:wq
好了,做完上述操作后請回到命令終端中,重新執行一遍configure命令,如果接着提示其他文件亦有同樣的錯誤,請按上述步驟來一遍即可。安裝完gtk-sharp之后,接着來裝gnome-sharp吧,這個東東貌似好幾年沒有更新過了,但是它依賴的外部組件卻要么失蹤、要么被河蟹了。
# cd /usr/local/src
# wget http://download.mono-project.com/sources/gnome-sharp2/gnome-sharp-2.24.1.tar.bz2
# tar -jxvf gnome-sharp-2.24.1.tar.bz2
# cd gnome-sharp-2.24.1
# ./configure --prefix=/usr
# make && make install
這次在make階段遇到一個代碼編譯錯誤: generated/CanvasShape.cs(200,41): error CS0030: Cannot convert type `GLib.Value' to `Art.VpathDash'
意思是不能把GLib.Valuel類型轉換成Art.VpathDash類型,所在的代碼文件位置於:
/usr/local/src/gnome-sharp-2.24.1/gnome/generated/CanvasShape.cs
打開這個cs文件找到錯誤處,內容如下:
[GLib.Property ("dash")]
public Art.VpathDash Dash{
get{
GLib.Value val = GetProperty ("dash");
Art.VpathDash ret = (Art.VpathDash) val;
val.Dispose();
return ret;
}
set{
GLib.Value val = new GLib.Value(value);
SetProperty("dash", val);
val.Dispose();
}
}
這是關於gnome的代碼,俺也沒用過,索性直接將上面高亮的代碼改成:Art.VpathDash ret = new Art.VpathDash();
保存退出,再重新執行make命令,又會遇到一個“找不到Mono.GetOptions.dll程序集”的編譯錯誤,這是由於Mono.GetOptions.dll在現有版本中已經被重命名為Mono.Options.dll了,但是GNOME C# Bind包源碼還沒有及時更新所致。但如果把新版的Mono.Options.dll拷貝到該源碼同目錄中,並修改該編譯引用,則提示有些類和命名空間不存在,這說明不光程序集被改名了,連里面的類和命名空間也改了。尼瑪,這就坑爹了...
那就干脆把用到Mono.GetOptions.dll(這個程序集的名字取得太矬了,是臨時工寫的吧)的代碼廢了它,於是找到這個編譯腳本,其位於:/usr/local/src/gnome-sharp-2.24.1/sample/gnomevfs/Makefile,用vim打開它,將221行和449、450這三行腳本注釋掉(如下所示):
#EXTRA_TARGET = TestXfer.exe
#TestXfer.exe: $(srcdir)/TestXfer.cs $(assemblies)
# $(CSC) /out:TestXfer.exe $(references) -r:Mono.GetOptions.dll $(srcdir)/TestXfer.cs
上面注釋掉的編譯腳本應該不會引起什么問題,因為看得出來那只是個sample里面的測試項目!好了,如果人品沒問題的話,應該可以完成gnome-sharp的編譯安裝咯。最后,執行MonoDevelop的編譯安裝即可:
# cd /usr/local/src/monodevelop-4.0.9
# ./configure --prefix=/usr
# make && make install
總結
在CentOS/RHEL這樣的Linux中安裝MonoDevelop主要遇到的問題就是像glib-sharp、gnome-sharp這樣的依賴組件沒有提供簡便的rpm包,而需要使用源碼進行編譯安裝,編譯就編譯吧,蛋疼的是這些源碼包中含有的各種硬傷、各種坑,這才是讓像我這樣的Linux菜鳥無比痛苦之緣由。
我花了大半天的時間來搞MonoDevelop在CentOS 6.3上的安裝,中間走了些彎路,因為我知道OpenSUSE中自帶MonoDevelop,所以先是從OpenSUSE的packages中找glib-sharp這樣的rpm包來裝,但是此路不通;然后在google上瘋狂找各種rpm包,期間google被河蟹n次,每次都要等上一陣才能用,那種感覺真是對天朝恨得牙根癢啊~ 艹
最后,無圖無真相,特附上MonoDevelop 4.0.9在CentOS 6.3上的截圖一張,亦是紀念哈!終於可以將開發平台遷移到CentOS/MonoDevelop中來了,亦希望MonoDevelop4能不負所望!