近期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以後,就能夠考慮將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中的介面應該是如圖所看到的:
好了,以下我們直接按下Ctrl+Shift+B來編譯程式碼。此時VSCode將提示我們“配置任務執行程式”,這裡須要說明的是,在VSCode中你能夠感受到微軟對命令列和配置檔案的偏執。這讓適應了Visual Studio這樣功能強大的我們相當不習慣,依照VSCode的提示或者是通過Ctrl+Shift+P開啟命令皮膚,VSCode將在當前工作資料夾下為我們建立.vscode資料夾和tasks.json檔案,在VSCode中不論什麼和專案相關的配置資訊都會儲存在這裡啦。此時我們配置tasks.json:
{
// See https://go.microsoft.com/fwlink/?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"
}
在這裡須要說明的是一個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在第一次使用的時候,須要在網路環境下下載相關依賴。以下是博主眼下的外掛安裝情況:
我們如今按F5進行除錯。和編譯時一樣。假設使用者沒有為當前專案配置“任務除錯程式”。VSCode會提示我們去建立一個配置檔案launch.json,我們這裡選擇mono。該選項在安裝Mono-Debug外掛曾經是沒有的,該配置檔案例如以下,我們注意到這裡須要改動program屬性為MainClass.exe:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
"type": "mono",
"request": "launch",
"program": "${workspaceRoot}/MainClass.exe",
"args": [],
"cwd": "${workspaceRoot}",
"preLaunchTask": "",
"runtimeExecutable": null,
"env": {},
"externalConsole": false
},
{
"name": "Attach",
"type": "mono",
"request": "attach",
"address": "localhost",
"port": 5085
}
]
}
這裡有一個小插曲。在博主執行這個簡單的程式的時候,提示Mono的版本號和Mono-Debug外掛的版本號要求不一致,由於Mono-Debug外掛使用的是最新版本號的Mono。所以。果斷解除安裝眼下的mono,然後安裝最新的mono。安裝方法為:
sudo apt-get install mono-complete
這樣我們就能夠看到眼前的成果啦,我們成功地在VSCode執行了一個C#程式:
儘管我很想在這篇部落格中搞點乾貨出來。但是當我折騰數天以後。我大概就能夠寫出這樣一篇相當零碎的文章。到眼下為止我還是沒有搞明確,為什麼我在除錯地過程中,VSCode不會在我設定了斷點地地方停下來。希望知道這個原因的朋友能夠告訴我啊。這個過程最有意義的地方在於讓我進一步熟悉了Linux。在不一樣的地方。會有不一樣的風景。這個世界很大,不要給自己設限。興許我會去研究VSCode中的除錯技巧以及.NETCore相關內容。能看到C#跨平臺執行是件幸福的事情,而跨平臺開發是我一直在探索的方向之中的一個。夜晚已然來臨了。而這篇文章就是這樣了。謝謝大家的關注,晚安!