1. 程式人生 > >MonoDevelop 4.0.9 on CentOS 6.3 安裝筆記

MonoDevelop 4.0.9 on CentOS 6.3 安裝筆記

前言

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能不負所望!

MonoDevelop 4.0.9 on CentOS 6.3