如果長期有在追 dotnet cli 的人,就知道在某一個時間點,微軟將 dotnet cli 的設定檔從 project.json 轉回 project.csproj 的格式,主要是要讓建置的動作轉回使用 MSBuild 引擎
根據 文件 有提到,雖然下的指令是 dotnet publish -o pub -c Release
但事實上是執行 dotnet msbuild /t:Publish /p:OutputPath=pub /p:Configuration=Release
,這樣就引起我的好奇,其他的指令是否也是做同樣的事情。
幸好現在 dotnet core 相關的程式都有放到 GitHub 上,我們可以很容易地了解整體的運作方式
執行
此篇就用 dotnet build
為例
-
dotnet build 指令的程式碼,可以在這裡看到
-
BuildCommandParser.cs 將
build
指另註冊在 dotnet 命令清單的起始點 -
BuildCommand.cs 是將在命令視窗裡所下的指令做參數的解析並轉換成 msbuild 的建置參數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20...
var appliedBuildOptions = result["dotnet"]["build"];
msbuildArgs.Add($"-consoleloggerparameters:Summary");
if (appliedBuildOptions.HasOption("--no-incremental"))
{
msbuildArgs.Add("-target:Rebuild");
}
else
{
msbuildArgs.Add("-target:Build");
}
msbuildArgs.AddRange(appliedBuildOptions.OptionValuesToBeForwarded());
msbuildArgs.AddRange(appliedBuildOptions.Arguments);
bool noRestore = appliedBuildOptions.HasOption("--no-restore");
... -
由於
build
命令所使用的BuildCommand
是繼承RestoringCommand
source code 來的,所以預設有restore
的動作,這也是為什麼在文件上說,在建置前不需要執行dotnet restore
的原因了。 -
最後當執行
cmd.Execute()
時,會執行 MSBuildForwardingApp.cs 裡的 Execute 方法,在之後的細節就是根據當下的執行環境找到對的執行檔執行命令,有興趣的可以在從這邊繼續追
以上就是簡單描述當 dotnet cli 命令執行時,到底做哪些事情的筆記
-