筆者最近重新閱讀了相當多的文件,原本都以ASP. NET Framework寫Side Project,.NET 6 在今年已經發布了,筆者花了點時間評估是否要轉換,並同時做些.NET Core MVC的測試,但這水太深了,會分成好幾篇來講這些技術,來吧!
.Net Core與.Net Framework的差別
什麼是.NET Framework
.NET Framework包含了兩個很重要的元件,Common Language Runtime(CLR)與.Net Framework類別庫(lib),其中CLR的工作包含了記憶體管理、程式碼執行、編譯等服務,而有支援.NET的語言都可以使用lib,減少開發的時間。微軟在最近幾年已打算讓.NET Framework停在4.8的版本,先撇除寫程式的語感不談,光是CLR如果未來不更新,而硬體越來越新的情況,就很難保證日後的相容性會不會越來越差。
.NET Core
.NET Core原本出到3.1的版本,後來產品支線跟.NET Framework整併,並發布了.NET 5。故.NET 5的核心基本上就是從.NET Core去延伸發展,大概每年會發布一版,今年已經到了.NET 6了。
.NET Core最主要的特性就是可以跨平台,如Windows、Mac、Linux,跨平台有可能是不同的Server,所以.NET Core也常常會伴隨著出現容器化的關鍵字,如Docker、k8s等技術。原本.NET Framework與.NET Core的底層核心並不同,但這幾年微軟也開始往.NET Standard發展,目的就是希望能透過介面實作,產生一樣的程式類別庫,所以.NET Core其實有實作.部分.NET Framework的功能。聽起來很讚,感覺轉換應該不是難事,沒想到這個水很深,筆者實際試了之後才知道。有興趣想多了解兩者可參考(參1)
.NET Core SDK
SDK為軟體開發工具包,主要是用於軟體框架、硬體平台、作業系統等建立應用程式的開發工具組合,所以在寫程式碼時,可能因為部分lib有重複實作,所以寫起來語感很像,但背後的運作模式跟順序之類的可能就會不一樣。所以要寫.NET Core,第一個最重要的事情就是安裝SDK。
先到微軟官網(參2),就可以發現,不同的版本之間,就如同筆者上節提到的,底下的工具libary跟Runtime等內容是不一樣的,這裡筆者是下載.NET 5.0。下載後無腦安裝後,可以簡單測試是否已安裝了.NET Core的SDK。使用微軟內建的PowerShell來測試,只要在左下windows符號按下右鍵,找到搜尋並打上PowerShell就能開啟囉。
dotnet --info
看到畫面就代表安裝成功囉。網路上蠻多教學用cmd,但cmd會看不到文字游標的位置,用久了實在是很煩,就改用這套囉。
一開始筆者很納悶,網路上查了很多教學,都是用Command-Line Interface(CLI)來操作,但明明用Visual Studio就可以開.NET Core的專案,為何還要大費周章的用CLI來工作,這不是自找麻煩嗎? 後來好像有點明白些甚麼,因為上面小節有講到,.NET Core的目的是為了要跨平台,而其中容器化的技術Docker又是基於Linux的背景去撰寫程式,雖然Linux也有一些像XMing的GUI圖像化技術,但在那個環境下,硬要用圖形化界面有時候反而會比較麻煩(雖然筆者用CLI也碰到很多問題...),後面筆者會經常用VS跟CLI的方式交替比對。
用VS建立.NET Core MVC專案跟CLI有什麼差別?
- 檔案內容不一樣: 這不是廢話....好啦,認真說明。原本用VS建立的專案,例如依賴性內可以看到一些服務,打開相依性底下的架構,可以找到Microsoft.AspNetCore.APP等文件,代表的就是.NET Core的程式庫,包含認證、授權、請求處理、架構、路由等功能,但用CLI建立的專案找不到依賴性。而依賴性會透過NuGet來管理,所以CLI建立的專案中,肯定找不到NuGet。但讓筆者有點訝異的事,VS開的專案只有36KB,但CLI建立的有4.54MB。
- 使用的SDK可能不同: 如果安裝的VS版本比較舊,有可能會用到比較舊的SDK,筆者用2019的版本可以選擇Core 2.0、Core 3.1與Core 5.0,但還是要小心。筆者看到一篇說法是執行dotnet run應該是包含了建置的過程,但筆者測試如果用VS建置專案後,在CLI執行dotnet run會噴錯,所以dotnet run背後的機制可能不是完全都會執行build
- CLI建立的專案少了很多功能? : 用VS打開CLI建立的專案,發現怎麼一堆功能不見了,不能用Ctrl + C Ctrl + K 作註解、不能插入Controller、原本VS在編譯前會有錯誤提示,但改成CLI建立後怎麼都沒有了,怎麼都不一樣了…,這個改天筆者再補充說明,原來是筆者有些觀念沒搞清楚,雖然有點搞笑,但也因此多學了一點東西啦。
.Net Core CLI
別怕下指令工作
之前筆者直接用VS開啟MVC專案,就直接開始寫程式了,既然CLI建立的專案少了很多功能可用,那就用CLI來練習寫程式吧。如果有使用過Linux的人應該會很快就上手,基礎的工作指令像cd、mv、cp、rm、mkdir、ls完全一模一樣,如果要執行.NET的指令,只要在開頭使用dotnet字符,就會幫你以.NET的語法來編譯。例如
// 移動到某個資料夾
cd “要建立專案的資料夾”
// 建立專案(空白mvc、mvc、razor page)
dotnet new web
dotnet new mvc
dotnet new page
預設專案的檔名會依資料夾名稱命名,更細節操作可直接在PowerShell上打 「dotnet new」,就會出現這個指令的說明囉。如果要執行程式則使用
dotnet run
一開始筆者在這裡小卡了一下,原本用VS執行時,會自動出現網頁,但用CLI卻不會自動出現,原來是要自己開...,照著下面結果顯示預設的路由,自行用網頁輸入http://localhost:5001或http://localhost:5000就可以囉。
從空白.NET Core MVC專案重頭開始
筆者選擇建立空白的.NET Core MVC來測試,一方面是希望可以多練習CLI,另一方面是希望可以更徹底的了解MVC背後的工作機制。如果直接開MVC專案,很多環境跟注入已經都幫我們做好了,但建立空白的MVC會有一些環境上設定的差異,NET Core與.NET Framework在實現主程式所寫的程式碼邏輯也不太一樣,所幸筆者最近看了一些教學,也查了相當多的資料,覺得這次感受很深,就決定要把這些過程都記錄下來囉。
MVC專案中會有擁有下列幾個重要的資料夾或檔案,(O)代表用CLI開啟的MVC專案中,會出現的文件或資料夾,(X)代表不會出現
- wwwroot (X)
- Controllers (X)
- Models (X)
- Views (X)
- properties (O)
- appsettings.json (O)
- Program.cs (O)
- Startup.cs (O)
3w的資料夾主要是用來放網頁靜態文件或圖片,如.cs、.js或其他libary,建立資料夾的方法很簡單,在PowerShell中打上
mkdir “資料夾名稱”
像wwwroot中的內容,可能已經有寫好的網站想轉移到MVC框架下,靜態文件基本上不太會改變,就可以使用cp把檔案複製過來,例如
cp “原本檔案儲存的路徑/*” “欲儲存的路徑”
cp -r “資料夾(底下還有多個資料夾)”欲儲存的路徑”
像這裡的appsettings.json、Startup,在.NET Framework的專案中也沒看到,在Core中用了很多IoC/DI的觀念,光是Program.cs跟Startup.cs就要花很多時間才能大概理解工作流程,不過這個要延伸的概念太多了,筆者想看看要怎麼樣分篇比較好,因為有些內容會稍微深入一點,今天就先到這裡啦。