昨天,我理解了一件以前從來沒有認真思考過的事情。
CPU 根本看不懂 C#。
真正看懂我程式的人,是 Compiler。
而 Compiler 在完成檢查後,才會開始進行編譯。
但是新的 Why 又出現了。
每天寫程式時,我幾乎都會按下:
Build
Visual Studio 也常常跳出:
Build succeeded.
可是Build 到底做了什麼?
如果它真的很重要。
為什麼按完 Build,我的程式卻沒有執行?
今天,我決定親自做實驗,而不是直接查答案。
以前的我一直認為:
Build 就是把程式跑起來。
因為平常按下 F5。
程式就會執行。
所以我一直把:
Build
和
Run
當成同一件事情。
直到今天。
我才開始懷疑:
如果 Build 就是執行程式。
那為什麼會叫做:
Build(建置)
而不是:
Run(執行)
Build 前後到底有什麼不同?
首先先執行
dotnet clean
本我以為:
它會把整個 bin、obj 都刪掉。
結果卻發現:
-bin 的建置輸出被清除
-obj 仍然保留部分檔案
-NuGet 相關檔案也還存在
這和我原本想像的不一樣。
代表Clean 並不是把整個專案清空,而是清除 Build 所產生的輸出成果。

接著我重新執行
dotnet build
接著就出現
突然多出了很多以前從來沒有認真看過的檔案。
Build 看起來真的做了不少事情。
但是新的問題又來了。
Build 真的會執行程式嗎?
我把程式改成
Console.WriteLine("Day4");
然後再次執行:
dotnet build
我原本以為終端機應該會印出:
Day4
結果什麼都沒有。
只有: Build succeeded.
程式完全沒有執行。
Run 又做了什麼?
接著我改成執行:
dotnet run --project .\src\MiniWebFramework\MiniWebFramework.csproj
這次終端機終於印出了: Day4
也就是說真正執行程式的人不是 Build而是Run
完成今天的三個實驗後,我開始查閱 Microsoft 官方文件。
官方指出,dotnet build 的工作是:
將原始程式碼編譯,並產生可供執行的輸出成果。
也就是說它的工作包含:
-編譯程式
-建立組件(Assembly)
-產生執行所需的檔案
但不會執行程式本身。
真正執行程式的是 dotnet run,它會在需要時先完成建置,再啟動程式開始執行。
這和今天的實驗結果完全一致。
昨天的我:
Build = Run
今天的我:
Build 是準備程式,Run 才是真正開始執行程式。
Build 並不是程式執行的一部分。
它更像是一位幕後工作人員。
在正式開演之前,先把舞台、燈光、道具全部準備好。
等一切都完成後才真正開始表演。
今天,我還沒有開始撰寫自己的 Framework。
但是我開始理解了一件很重要的事情。
未來每增加一個 Router、Middleware 或 HttpContext。
都必須重新 Build。
只有完成 Build。
新的程式碼才會變成可以執行的成果。
因此,理解 Build 的角色,也是理解 Framework 建構流程的重要一步。
今天,我知道了 Build 並不是執行程式,它只是把程式準備好。
但是新的?又來了當 Build 完成後,專案裡突然多出了
MiniWebFramework.dll
MiniWebFramework.exe
MiniWebFramework.pdb
MiniWebFramework.deps.json
MiniWebFramework.runtimeconfig.json
以前的我從來沒有打開過它們,甚至不知道它們存在的目的。
為什麼 Build 需要產生這麼多檔案?下一篇,我想一個一個拆開它們,看看它們各自負責什麼工作。