引言

随着 .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.0net10.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 中的新增功能

.NET 10 中的新增功能系列文章3——.NET MAUI 中的新增功能

.NET 10 中的新增功能系列文章4——.NET SDK中的新增功能的更多相关文章

  1. 《SeleniumBasic 3.141.0.0 - 在VBA中操作浏览器》系列文章之一:SeleniumBasic的下载

    Selenium是一种非常流行的浏览器和网页自动化技术,开发人员可以使用C#.Java.Python等语言来操作Chrome.Firefox等浏览器. VBA语言可以直接操作访问Microsoft I ...

  2. 推酷文章中编写js组件系列文章整理

    一步一步实现JS拖拽插件 http://www.tuicool.com/articles/RBbmMjY JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享 http://ww ...

  3. 微信JS分享功能--微信JS系列文章(二)

    概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...

  4. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...

  5. Grafana 系列文章(八):Grafana Explore 中的 Inspector

    ️URL: https://grafana.com/docs/grafana/latest/explore/explore-inspector/ Description: Explore 中的检查器 ...

  6. 无废话C#设计模式系列文章

    不错的系列文章 原文:http://www.cnblogs.com/lovecherry/archive/2007/10/17/927728.html 本系列文章从公司内部的知识分享修改而来,有错误或 ...

  7. Entity Framework系列文章导航

    转自:http://www.cnblogs.com/xray2005/archive/2011/10/11/2206746.html Entity Framework4.0系列文章 需要说明的是,以下 ...

  8. 《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

    <如何让TT T4模板输出多个文件(VS2010中)>-- access911.net 文章   问题:   VS2010中自带的 TT 模板功能挺好用,但是如何定义其输出的目录,或者如何 ...

  9. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  10. IT软件人员的技术学习内容(写给技术迷茫中的你) - 项目管理系列文章

    前面笔者曾经写过一篇关于IT从业者的职业道路文章(见笔者文:IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章).然后有读者提建议说写写技术方面的路线,所以就有了本文.本文从初学者到思想 ...

随机推荐

  1. Django中的Ajax表单提交与文件上传

    Django中Ajax表单提交 Ajax是以一种与服务器交换数据的技术,可以在不重载整个页面的情况下更新网页的一部分.它也可以运用在Django项目的表单中,与普通的views函数不一样的是:表单所在 ...

  2. FileChooser文件保存样例

    FileChooser fc = new FileChooser();fc.setTitle("请选择文件保存位置");fc.setInitialDirectory($原始文件位置 ...

  3. odoo14的qweb打印单样式丢失问题

    问题:在开发odoo14的打印单过程中:Wkhtmltopdf打印插件已安装的情况下,发现样式丢失了,如下图 问题的原因: 1.可能是外网与内网服务转换时候造成的样式丢失,有时候是端口不一致导致的某些 ...

  4. Spring 注解之@RequestHeader注解:获取请求头参数

    基本用法   Spring MVC提供了 @RequestHeader注解,其作用是将请求头中的参数值映射到控制器的参数中.常用属性如下: name:header值被绑定到的参数名称(The name ...

  5. LocalDateTime获取 年月日时分秒和判断日期大小

    环境:java version "13.0.1". 创建一个DateUtils类,提供三个常用方法: String 转换 LocalDateTime的方法. 获取LocalDate ...

  6. 【Java】汉字转拼音

    将汉字转成拼音及汉字首字母,可以使用jar包 pingyin4j,但是遇到多音节汉字就会有问题.如果使用大名鼎鼎的jpinyin,可以自动识别常见多音字,而且还支持简体转换为繁体,检查是简体还是繁体, ...

  7. 【2020.11.19提高组模拟】倍数区间interval 题解

    [2020.11.19提高组模拟]倍数区间interval 题解 题目描述 定义在序列\(a_1,a_2,\dots,a_n\)上的合法区间\([L,R]\)为满足\(\exists k\in [L, ...

  8. 现代 Python 包管理器 `uv`

    用 uv + Python 开发命令行工具 当使用 uv 写正规一点的 CLI 应用的时候,还是应该使用 uv init --package [package name] 因为写一个命令行程序总是要安 ...

  9. LEECODE Rust学习: 一维数组的动态和

    给你一个数组 nums .数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]-nums[i]) . 请返回 nums 的动态和. 示例 1: 输入:nums = [1, ...

  10. 从Multirepo到Monorepo 袋鼠云数栈前端研发效率提升探索之路

    一.困境频生 前端代码管理何解? 前端代码管理一直是困扰不少前端开发团队的难题,从开发到发布的整体工作流程中,除了常规的技术问题外,往往还伴随着沟通成本.维护成本及协作效率等问题.这些问题在团队规模较 ...