.NET 10 中的新增功能系列文章4——.NET SDK中的新增功能
引言
隨著 .NET 10 的發布,.NET SDK 迎來了一系列令人振奮的新功能和增強特性。這些改進不僅提升了開發者的工作效率,還優化了應用程序的性能和部署體驗。本文將詳細介紹 .NET 10 SDK 中的新增功能,包括工具改進、基于文件的應用增強、包引用修剪等,幫助開發者充分利用這些新特性來構建更高效的應用程序。
正文
.NET 工具改進
特定于平臺的 .NET 工具
.NET 10 引入了對多平臺 .NET 工具的增強支持,開發者現在可以在單個包中發布支持多個 RuntimeIdentifier (RID) 的工具。這意味著工具作者可以捆綁所有受支持平臺的二進制文件,而 .NET CLI 會在安裝或運行時自動選擇正確的二進制文件。這一改進顯著簡化了跨平臺工具的創作和分發流程。
這些改進的工具支持多種包裝變體:
- 依賴于框架,平臺無關(經典模式,任何安裝了 .NET 10 的地方都可以運行)
- 框架依賴,平臺特定(更小,針對每個平臺進行優化)
- 自包含,平臺特定(包含運行時,無需安裝 .NET)
- 裁剪版,平臺特定(更小,裁剪未使用的代碼)
- 平臺特定的 AOT 編譯(最大性能和最小部署)
這些新工具的工作方式與常規的已發布應用程序非常相似,因此任何可用于應用程序的發布選項(如自包含、剪裁或 AOT 編譯)也同樣適用于這些工具。
單次工具執行
.NET 10 引入了 dotnet tool exec 命令,允許開發者執行 .NET 工具而無需全局或本地安裝該工具。這對于 CI/CD 或臨時使用場景尤其有用。
dotnet tool exec --source ./artifacts/package/ toolsay "Hello, World!"
執行此命令會下載并運行指定的工具包。如果工具本地不存在,系統會提示用戶確認下載。除非指定顯式版本(如 toolsay@0.1.0),否則將使用工具包的最新版本。
新的 dnx 工具執行腳本
dnx 腳本提供了一種簡化的方式來執行工具,它將所有參數轉發到 dotnet CLI 進行處理:
dnx toolsay "Hello, World!"
dnx 命令的實際實現是在 CLI 本身的 dotnet 中,這允許其行為隨時間推移而演變。
通過 --cli-schema 實現的 CLI 自省
所有 CLI 命令上都新增了 --cli-schema 選項。使用時,它會輸出調用的命令或子命令的 CLI 命令樹的 JSON 表示形式,這對于工具作者、shell 集成和高級腳本非常有用。
dotnet clean --cli-schema
輸出示例:
{
"name": "clean",
"version": "10.0.100-dev",
"description": ".NET Clean Command",
"arguments": {
"PROJECT | SOLUTION": {
"description": "The project or solution file to operate on...",
"arity": { "minimum": 0, "maximum": null }
}
},
"options": {
"--artifacts-path": {
"description": "The artifacts path...",
"helpName": "ARTIFACTS_DIR"
}
},
"subcommands": {}
}
基于文件的應用程序功能增強
具備發布支持和本地 AOT 的增強
基于文件的應用現在支持通過 dotnet publish app.cs 命令發布到本機可執行文件,默認情況下,所有基于文件的應用都以本機 AOT 為目標。如果需要使用與本機 AOT 不兼容的包或功能,可以使用 #:property PublishAot=false 指令禁用此功能。
基于文件的應用還包括以下增強功能:
- 項目引用:支持通過
#:project指令引用項目 - 運行時路徑訪問:應用程序文件和目錄的路徑可在運行時通過
System.AppContext.GetData訪問 - 增強了 shebang 支持:通過改進的 shebang 處理(包括支持無擴展名文件),直接執行 shell 腳本
項目引用示例:
#:project ../ClassLib/ClassLib.csproj
var greeter = new ClassLib.Greeter();
var greeting = greeter.Greet(args.Length > 0 ? args[0] : "World");
Console.WriteLine(greeting);
增強的 shebang 支持示例:
#!/usr/bin/env dotnet
Console.WriteLine("Hello shebang!");
修剪由框架提供的包引用
從 .NET 10 開始,NuGet 審核功能現在可以修剪項目不使用的框架提供的包引用。默認情況下,所有 net 目標框架(如 net8.0 和 net10.0)以及 .NET Standard 2.0 及更高版本的目標框架都啟用此功能。
此更改有助于:
- 減少生成過程中還原和分析的包數量
- 縮短生成時間
- 減少磁盤空間使用量
- 減少來自 NuGet 審計以及其他依賴項掃描機制的誤報情況
雖然此功能默認為列出的 TPM 啟用,但可以通過在項目文件中將 RestoreEnablePackagePruning 屬性設置為 false 來禁用此功能。
更一致的命令順序
.NET 10 引入了常見命令的新別名,使它們更易于記住和鍵入:
| 新名詞優先形式 | 別名 |
|---|---|
| dotnet package add | dotnet add package |
| dotnet package list | dotnet list package |
| dotnet package remove | dotnet remove package |
| dotnet reference add | dotnet add reference |
| dotnet reference list | dotnet list reference |
| dotnet reference remove | dotnet remove reference |
新的名詞優先表單符合一般 CLI 標準,使 dotnet CLI 與其他工具更加一致。雖然動詞優先表單繼續工作,但建議使用名詞優先表單以提高腳本和文檔中的可讀性和一致性。
CLI 命令默認為交互式終端中的交互模式
在交互式終端中,現在默認啟用 --interactive 標志用于 CLI 命令。此更改允許命令動態檢索憑據或執行其他交互行為,而無需顯式設置標志。對于非交互方案,可以通過指定 --interactive false 來禁用交互性。
原生 shell Tab 補全腳本
dotnet CLI 現在支持使用 dotnet completions generate [SHELL] 命令為常用 shell 生成原生 Tab 補全腳本。支持的 shell 包括:
- bash
- fish
- nushell
- powershell
- zsh
例如,在 PowerShell 中,可以通過將以下內容添加到 $PROFILE 中來啟用補全功能:
控制臺應用可以原生創建容器映像
控制臺應用現在可以通過 dotnet publish /t:PublishContainer 創建容器映像,而無需在項目文件中包含 <EnableSdkContainerSupport> 屬性。這使控制臺應用與 ASP.NET Core 和 Worker SDK 應用的行為保持一致。
使用新的 <ContainerImageFormat> 屬性可以顯式地將容器映像的格式設置為 Docker 或 OCI。此屬性替代默認行為,具體取決于基本映像格式以及容器是否為多體系結構。
支持 dotnet test 中的 Microsoft 測試平臺
從 .NET 10 開始,dotnet test 原生支持 Microsoft.Testing.Platform。要啟用此功能,可以將以下配置添加到 dotnet.config 文件:
[dotnet.test.runner]
name = "Microsoft.Testing.Platform"
系列文章
.NET 10 中的新增功能系列文章1——運行時中的新增功能
.NET 10 中的新增功能系列文章2——ASP.NET Core 中的新增功能
浙公網安備 33010602011771號