.NET 10 dnx 登场.NET 的 npx/uvx 时代拉开序幕在快速发展的软件开发领域敏捷性和效率至关重要。开发者需要能够快速尝试新工具、运行特定任务而无需繁琐的安装或环境配置。Python 的uvx和 Node.js 的npx等工具因其“一次性”执行能力而广受赞誉它们允许开发者按需运行命令行工具极大地简化了工作流程。.NET 10 通过引入dnx工具执行脚本这一新功能使.NET 直接与 Python 和 Node.js 等生态系统中备受推崇的流畅“一次性”执行和快速本地启动能力对齐。即时执行的力量dnx vs uvx vs npxdnx以及dotnet tool exec的引入明确地将.NET 的工具执行体验与 Python 的uvx和 Node.js 的npx对齐。这三者都遵循“无需安装即可运行”的核心理念旨在提供无摩擦的开发者体验。.NET 的 dnx.NET 10 SDK 引入了新的dnx工具执行脚本。dnx 其本质上是dotnet tool exec命令的一个精简、用户友好的包装器其核心功能是实现.NET 工具的“一次性”one-shot或“按需”on-demand执行。 这意味着开发者可直接从 NuGet 包运行.NET 工具而无需进行永久性的本地或全局安装 。当调用dotnet tool exec或 dnx时工具包会被临时下载到 NuGet 缓存中并直接从那里执行。这种关键的设计选择意味着系统的 PATH 环境变量不会被修改从而确保了干净和隔离的执行环境。 在版本管理方面默认情况下会使用指定工具包的最新版本。然而开发者也可以明确请求特定版本例如toolsay0.2.0。如果当前目录或其任何父目录中存在本地工具清单文件.config/dotnet-tools.json则该配置中指定的工具版本将优先使用从而确保项目特定的一致性。Python 的 uvxuvx 是 uv 包管理器的一部分旨在解决 Python 包管理中的痛点如安装时间慢和依赖冲突。 uvx 允许在不永久安装工具的情况下调用工具将其安装到临时、隔离的环境中。它支持指定特定版本、额外功能以及从 Git 仓库拉取工具 。 uv 的 Rust 实现使其在性能上远超 pip并且内置了虚拟环境管理功能。Node.js 的 npxnpx 的主要目的是执行 Node.js 包的二进制文件而无需全局或本地安装该包。它会临时下载包运行指定的命令然后自行清理。 npx 广泛用于运行一次性命令、搭建新项目例如 npx create-react-app、执行本地安装的项目二进制文件、尝试不同包版本甚至直接从 GitHub 仓库或 Gist 执行代码。三者对比属性dnx (.NET 10)uvx (Python)npx (Node.js)核心理念按需执行 NuGet 工具无安装污染按需执行 PyPI 工具无安装污染按需执行 npm 包无安装污染执行模型下载到隔离 NuGet 缓存执行不修改 PATH安装到临时隔离虚拟环境执行临时下载执行并清理版本控制支持指定版本优先本地清单支持或指定版本支持指定版本底层技术/生态基于成熟dotnetCLI、NuGet、MSBuild (C)uv(Rust 高性能统一工具链) 的一部分与npm捆绑 (JavaScript)生态整合/影响发展中旨在培育 NuGet CLI 工具生态统一工具链(uv)旨在取代pip/pipx等深度成熟重塑了 Node.js CLI 工具分发模式主要用例工具试用、脚手架、CI/CD、临时服务工具试用、环境管理脚手架、临时服务器、尝试版本dnx 上手实操基于 dotnet-execute 工具❝dotnet-execute(https://github.com/WeihanLi/dotnet-exec是一个用于在没有项目文件的情况下执行 C# 程序的命令行工具你可以使用自定义的入口点而不是 Main 方法。控制台输出 dnx dotnet-execute WriteLine(\Hello dnx!!!\); --using static System.Console Hello dnx!!!快速生成 GUID 或执行简单表达式 dnx dotnet-execute Guid.NewGuid() -y [c1b1e7e4-7004-430f-b81d-3808cc782a4d]使用 LoadTestToolbox 工具❝LoadTestToolbox轻量级压测工具支持三种测试模式drill稳定性测试、hammer并发性能测试、nailgun瞬时压力测试结果可输出为图表测试百度首页的并发性能1~100个并发请求 dnx LoadTestToolbox hammer --url https://www.baidu.com --min 1 --max 100 --filename hammer.png Tool package loadtesttoolbox2.0.0 will be downloaded from source https://api.nuget.org/v3/index.json. Proceed? [y/n] (y): Y Sending/receiving requests ━━━━━ 100% [ 00:00:01 elapsed / 00:00:00 remaining ]测试百度首页的瞬时性能瞬间发起100个请求 dnx LoadTestToolbox nailgun --url https://www.baidu.com --requests 100 --filename nailgun.png Sending/receiving requests ━━━━━━━━ 100% [ 00:00:00 elapsed / 00:00:00 remaining ]使用 json2yaml 工具❝json2yaml一个简单的工具用于将JSON转换为YAML。 2yaml转换器读取JSON输入来自文件、URL端点或stdin并生成转换后的YAML输出到文件或stdout。PS : cat .\.mcp\server.json { description: 一个带有天气、随机数和待办工具的示例MCP服务器, name: io.github.sheng-jie/SampleMcpServer, packages: [ { registry_name: nuget, name: sheng-jie.SampleMcpServer, version: 0.3.0, package_arguments: [], environment_variables: [ { name: WEATHER_CHOICES, description: 以逗号分隔的天气描述列表, is_required: true, is_secret: false } ] } ], repository: { url: https://github.com/sheng-jie/SampleMcpServer, source: github }, version_detail: { version: 0.3.0 } } PS dnx json2yaml -i:.\.mcp\server.json -c Tool package json2yaml6.0.0 will be downloaded from source https://api.nuget.org/v3/index.json. Proceed? [y/n] (y): Y description: 一个带有天气、随机数和待办工具的示例MCP服务器 name: io.github.sheng-jie/SampleMcpServer packages: - registry_name: nuget name: sheng-jie.SampleMcpServer version: 0.3.0 package_arguments: [] environment_variables: - name: WEATHER_CHOICES description: 以逗号分隔的天气描述列表 is_required: true is_secret: false repository: url: https://github.com/sheng-jie/SampleMcpServer source: github version_detail: version: 0.3.0使用 dotnet-decode-jwt 工具❝dotnet-decode-jwt :用于解码JSON Web Token声明的.NET全局工具 dnx dotnet-decode-jwt eyJhbGciOiJub25lIn0.ewogICAgImlzcyI6ICJiZXN0LWlzc3VlciIsCiAgICAic3ViIjogIm5pY2Utc3ViamVjdCIsCiAgICAiYXVkIjogWyJhdWRpZW5jZS1vbmUiLCAiYXVkaWVuY2UtdHdvIl0sCiAgICAiZXhwIjogMTUyODY5MTM1MCwKICAgICJuYmYiOiAxNTI4NjkwNzUwLAogICAgImlhdCI6IDE1Mjg2OTA3NTAsCiAgICAianRpIjogImMzMTk3ZGNiLWUxMTMtNDc3OC04OTc5LWI5NTZmNjg0MDA3ZiIsCiAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZW1haWxhZGRyZXNzIjogImhpQG1lLmNvbSIsCiAgICAic29tZS1udW1iZXIiOiAxMi41NiwKICAgICJuZXN0ZWQtY2xhaW0iOiB7CiAgICAgICAgImhpIjogIkknbSIsCiAgICAgICAgImEiOiAibmVzdGVkIGNsYWltIgogICAgfQp9Cg. -y Expiration Time (exp): Monday, June 11, 2018 04:29:10 UTC / Monday, June 11, 2018 12:29:10 (UTC08:00) Beijing, Chongqing, Hong Kong, Urumqi Not Before (nbf): Monday, June 11, 2018 04:19:10 UTC / Monday, June 11, 2018 12:19:10 (UTC08:00) Beijing, Chongqing, Hong Kong, Urumqi Issued At (iat): Monday, June 11, 2018 04:19:10 UTC / Monday, June 11, 2018 12:19:10 (UTC08:00) Beijing, Chongqing, Hong Kong, Urumqi Claims are: { iss: best-issuer, sub: nice-subject, aud: [ audience-one, audience-two ], exp: 1528691350, nbf: 1528690750, iat: 1528690750, jti: c3197dcb-e113-4778-8979-b956f684007f, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress: hime.com, some-number: 12.56, nested-claim: { hi: Im, a: nested claim } }最后令人期待和振奋的.NET 10.NET 10 中 dnx 的引入和 dotnet tool exec 的增强是.NET 工具链现代化进程中的一个里程碑。它不仅在功能上与uvx和npx等现代工具执行器对齐更重要的是它将“一次性”执行的敏捷性带入了.NET 生态系统。这种转变将.NET 定位为一个更具竞争力的平台为开发者提供了前所未有的灵活性和效率。展望未来可以预见随着这些功能的成熟和普及NuGet 上将出现一个蓬勃发展的.NET 工具新类别进一步巩固.NET 作为构建复杂、现代化应用程序的首选平台的地位。