天天看點

基于Mono和VSCode打造輕量級跨平台IDE

  近期Visual Studio推出Mac版本号的消息迅速在技術圈裡刷屏,當project師們最喜歡的筆記本電腦Mac,邂逅地球上最強大的內建開發環境Visual Studio的時候,會碰撞出如何精彩的火花呢?在微軟新任CEO納德拉的“移動為先、雲為先”戰略下,微軟的轉變漸漸開始讓人欣喜。從.NET Core、VSCode、TypeScript再到近期的Visual Studio For Mac,這一系列動作讓我們感覺到。微軟的技術棧越來越多地向着開源和跨平台兩個方向努力。

我們曾經固執地覺得。微軟的技術棧注定永遠無法擺脫Windows的束縛,而其實這個世界每天都在發生着變化。也許這次Visual Studio推出Mac版這件事情,本質上是微軟收購的Xamarin公司旗下産品Xamarin Studio的一次改頭換面。但是這件事情說明。微軟正在努力讓.NET技術棧融入很多其它的應用場景。對我而言,我是沒有錢去買一台Mac的,是以在這篇文章中,我們将在Linux下通過Mono和VSCode來打造一個輕量級的IDE。

而據說Mono會和Xamarin一樣。将來會成為.NET基金會的一部分。

  好了,我們首先在Windows世界裡進行彩排。在開始以下的内容曾經,請保證你的計算機上安裝了Mono和VSCode。假如你常常關注我的部落格,你應該會知道Mono在這裡的作用是什麼?。簡而言之,Mono為我們提供了編譯器環境和執行時環境。在這個基礎上VSCode這個天生帶着Visual Studio基因的編輯器,則能夠為我們提供基礎的代碼調試功能。這是我們這篇文章寫作的關鍵因素。

假設你還對Mono一無所知,以下的兩篇文章能夠幫助你高速了解:

使用Mono讓.NET程式跨平台執行

使用Mono打造輕量級的.NET執行時

  在我們了解了Mono以後,就能夠考慮将Mono作為VSCode的執行時環境,這意味着我們能夠在使用VSCode的同一時候直接編譯代碼。眼下在VSCode中内建的執行時支援為Node/Node2,是以假設我們希望在VSCode中調試很多其它的語言。我們就必須要為VSCode安裝對應的插件。

由于其實在VSCode中編譯代碼我們能夠直接通過Task來完畢編譯,但當我們希望在VSCode中對代碼進行調試的時候,我們就必須借助插件來完畢調試任務。這也許從側面印證了VSCode的産品定位就是一個文本編輯器。

  而對于微軟推出的這樣一款産品,我們也許會疑惑。為什麼這個編輯器提供的内建支援竟然是Node,而不是我們所熟悉的.NET技術體系。這個原因很easy了解,假設你聽說過Github出品的編輯器Atom,或者是使用過Electron/Node-Webkit相關技術,那麼你一定會深刻地了解,VSCode本質上和Atom一樣。都是採用Web技術來建構跨平台應用,而Node天生就具備Web屬性加成。是以我們就不難了解為什麼VSCode内建的支援是Node而非.NET技術體系。相同地,為了實作跨平台的目标,在對C#語言的支援這個問題上,微軟選擇了OminiSharp這樣一個跨平台的代碼自己主動補全工具,而非我們在Visual Studio中所熟知的Intellisense技術。

在.NETCore推出以後.NET跨平台不再是夢想,我們對技術的探索就不應該再局限在Windows平台上。

  部落客關注Mono始于Unity3D引擎,由于Mono真正實作了.NET技術的跨平台,而Unity3D引擎最為人所稱道的當屬其強悍的跨平台能力。在這一點上Mono功不可沒。在此之前收費的Xamarin讓人望而卻步。是以Mono自然而然地就成為了我的選擇。由于部落客的計算機上安裝了Mono,是以在一開始使用VSCode的時候,就先入為主地覺得在不安裝插件的情況下,應該就能夠直接在VSCode中編譯和調試代碼了。首先我們在VSCode中建立一個C#代碼檔案,既然在程式世界裡萬事萬物都從Hello World說起,那麼我們這裡依舊遵循這個原則。在建立該代碼檔案以後。我們将其所在的檔案夾在VSCode中打開,這是由于:

在VSCode中僅支援以檔案夾方式打開的檔案的編譯和調試

是以這個時候我們在VSCode中的界面應該是如圖所看到的:

基于Mono和VSCode打造輕量級跨平台IDE

好了,以下我們直接按下Ctrl+Shift+B來編譯代碼。此時VSCode将提示我們“配置任務執行程式”,這裡須要說明的是,在VSCode中你能夠感受到微軟對指令行和配置檔案的偏執。這讓适應了Visual Studio這樣功能強大的我們相當不習慣,依照VSCode的提示或者是通過Ctrl+Shift+P打開指令面闆,VSCode将在目前工作檔案夾下為我們建立.vscode檔案夾和tasks.json檔案,在VSCode中不論什麼和項目相關的配置資訊都會存儲在這裡啦。此時我們配置tasks.json:

<code></code>

<code>LinkId=733558 // for the documentation about the tasks.json format "version": "0.1.0", // 該指令須要在系統變量内定義 "command": "mcs", // 或者使用完整的可執行路徑 // "command: "C:\Program Files\Mono\bin\mcs.exe" "isShellCommand": true, "args": ["*.cs"], "showOutput": "always" }</code>

在這裡須要說明的是一個tasks.json中能夠通過tasks屬性來配置多個任務執行程式。比如我們的項目中有Python和C#兩種代碼須要編譯。那麼我們就能夠配置兩個task,VSCode将在執行程式的時候讓使用者由哪一個task來編譯代碼。假設你看過我在前面介紹過的兩篇文章,就應該知道這裡的mcs.exe其實是Mono提供的C#編譯器。它負責将我們的C#代碼編譯為IL檔案,然後IL檔案再交由CLR來轉換為本機代碼。Mono提供的C#編譯器能夠将C#代碼編譯為.exe或者是.dll。但是在VSCode中好像預設都是編譯為.exe。是以假設有知道如何在這裡配置編譯輸出項的朋友。希望能夠告訴我怎麼去實作。

  如今,我們應該會得到一個MainClass.exe的檔案,最初部落客嘗試直接去配置launch.json,發現直接填寫type為mono在VSCode中是無法識别的,最後決定去安裝mono-debug的插件。安裝插件在VSCode中是很簡單的。按下Ctrl+Shift+X打開插件界面。能夠在這裡檢視最流行的插件清單、官方推薦的插件清單等等,我們直接搜尋mono-debug然後安裝插件就可以。但是我不曾想到的是,我猜中故事的開頭,卻沒有猜中故事的結尾,這個插件是不支援Window平台的。這個插件是不支援Windows平台的,這個插件是不支援Windows平台的。

  好吧,如今看起來Linux是我唯一能夠去嘗試的平台了。部落客這裡選擇的是顔值最高的Elementary OS。這是一個衍生自Ubuntu的Linux發行版。在VSCode正式版公布以後。在Linux下用VSCode來程式設計是我一直在嘗試的事情,請不要說Linux系統使用起來會很困難。部落客在安裝這些軟體的過程中能夠說是相當順利。建議大家在Linux平台下安裝C#、Mono-Debug和Python這3個插件。須要說明的是C#和Mono-Debug在第一次使用的時候,須要在網絡環境下下載下傳相關依賴。以下是部落客眼下的插件安裝情況:

基于Mono和VSCode打造輕量級跨平台IDE

  我們如今按F5進行調試。和編譯時一樣。假設使用者沒有為目前項目配置“任務調試程式”。VSCode會提示我們去建立一個配置檔案launch.json,我們這裡選擇mono。該選項在安裝Mono-Debug插件曾經是沒有的,該配置檔案例如以下,我們注意到這裡須要改動program屬性為MainClass.exe:

  這裡有一個小插曲。在部落客執行這個簡單的程式的時候,提示Mono的版本号和Mono-Debug插件的版本号要求不一緻,由于Mono-Debug插件使用的是最新版本号的Mono。是以。果斷解除安裝眼下的mono,然後安裝最新的mono。安裝方法為:

這樣我們就能夠看到眼前的成果啦,我們成功地在VSCode執行了一個C#程式:

基于Mono和VSCode打造輕量級跨平台IDE

  盡管我很想在這篇部落格中搞點幹貨出來。但是當我折騰數天以後。我大概就能夠寫出這樣一篇相當零碎的文章。到眼下為止我還是沒有搞明确,為什麼我在調試地過程中,VSCode不會在我設定了斷點地地方停下來。希望知道這個原因的朋友能夠告訴我啊。這個過程最有意義的地方在于讓我進一步熟悉了Linux。在不一樣的地方。會有不一樣的風景。這個世界很大,不要給自己設限。興許我會去研究VSCode中的調試技巧以及.NETCore相關内容。能看到C#跨平台執行是件幸福的事情,而跨平台開發是我一直在探索的方向之中的一個。夜晚已然來臨了。而這篇文章就是這樣了。謝謝大家的關注,晚安!

繼續閱讀