{"id":2304,"date":"2025-07-29T18:13:38","date_gmt":"2025-07-29T18:13:38","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/07\/29\/aspire-9-4-is-here-with-a-cli-and-interactive-dashboard-features\/"},"modified":"2025-07-29T18:13:38","modified_gmt":"2025-07-29T18:13:38","slug":"aspire-9-4-is-here-with-a-cli-and-interactive-dashboard-features","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/07\/29\/aspire-9-4-is-here-with-a-cli-and-interactive-dashboard-features\/","title":{"rendered":"Aspire 9.4 is here with a CLI and interactive dashboard features"},"content":{"rendered":"<p>Today, we released .NET Aspire 9.4, our biggest release <em>ever<\/em>, bringing new integrations, interactive dashboard-based inputs, and a standalone, native AOT command line tool for creating and running Aspirified apps. We also published our <a href=\"https:\/\/github.com\/dotnet\/aspire\/discussions\/10644\">first roadmap<\/a> last week, which outlines a bunch of exciting features we want to tackle in the next 6 months. There are too many things in this release for me to cover in one blog, so I picked some of my favorites to share \u2013 you can see the rest in our <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/whats-new\/dotnet-aspire-9.4\">What\u2019s New docs<\/a>.<\/p>\n<h2>Just clone and \u201caspire run\u201d with the new Aspire CLI<\/h2>\n<p>With Aspire 9.4, the Aspire CLI is <strong>officially GA<\/strong> and here to make your dev loop even more seamless. The CLI gives you a fast, scriptable, and consistent way to scaffold, run, and configure your apps.<\/p>\n<p>This release brings the first four core commands:<\/p>\n<p>aspire new \u2013 Choose from our set of templates to kickstart your app<br \/>\naspire add \u2013 Add Aspire hosting integrations from anywhere in your repo<br \/>\naspire run \u2013 Run your full app stack from any terminal or editor (or subdirectory!)<br \/>\naspire config \u2013 View, set, and change CLI settings and feature flags \u2013 local to your repo or global to your machine<\/p>\n<div class=\"wp-video\"><!--[if lt IE 9]&gt;document.createElement('video');&lt;![endif]--><br \/>\n<a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2025\/07\/AspireCLI-BlogDemo.webm\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2025\/07\/AspireCLI-BlogDemo.webm<\/a><\/div>\n<p>We\u2019re also including an updated version of aspire publish, which is still in preview, and two commands in beta \u2013 exec (for executing CLI tools like database migrations) and deploy (for deploying your full stack to dev, test, or even prod environments). The two beta commands can be turned on via aspire config set \u2013 see the CLI Reference docs for more details.<\/p>\n<p>The CLI is native AOT (ahead-of-time) compiled, making it super fast across different architectures. You can download the GA CLI from our install script:<\/p>\n<p>Bash:<\/p>\n<p>curl -sSL https:\/\/aspire.dev\/install.sh | bash<\/p>\n<p>Powershell:<\/p>\n<p>iex &#8220;&amp; { $(irm https:\/\/aspire.dev\/install.ps1) }&#8221;<\/p>\n<div class=\"alert alert-primary\">\n<p class=\"alert-divider\"><strong>Note<\/strong><\/p>\n<p>You can continue using the Aspire CLI as a dotnet tool, but it will not be the AOT version. If you\u2019re currently using the dotnet tool and would like to update to the AOT version, first uninstall it with dotnet tool uninstall -g aspire.cli.<\/p><\/div>\n<p>Learn more about the Aspire CLI in our <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/cli\/overview\">docs<\/a>.<\/p>\n<h2> Custom dashboard interactivity<\/h2>\n<p>With Aspire, you can tailor the dashboard to your specific application with <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/fundamentals\/custom-resource-commands\">custom resource commands<\/a> and <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/fundamentals\/custom-resource-urls\">named URLs<\/a>, and the ability to hook into resource <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/app-host\/eventing\">lifecycle events<\/a>. Aspire 9.4 brings a user-friendly overhaul to our eventing APIs and a major new extensibility point for you to leverage \u2013 the interaction service.<\/p>\n<p>With the interaction service, you can create custom UX to get user input during development while the app is running, present notifications, or ask for confirmation before running a command. The interaction service supports 5 different input types:<\/p>\n<p>Text (Standard text input \u2013 great for passing args, creating mock data, etc)<br \/>\nSecretText (Masked text input \u2013 great for API keys, tokens, etc)<br \/>\nNumber (Numeric input \u2013 great for seeding DB items, running load tests)<br \/>\nChoice (Dropdown from a set list \u2013 useful for structured inputs)<br \/>\nBoolean (Checkbox \u2013 great for toggling on things like mock data at runtime)<\/p>\n<p>The interaction service also works in the CLI for inputs required during publish and deploy.<\/p>\n\n<div class=\"alert alert-primary\">\n<p class=\"alert-divider\"><strong>Preview Feature<\/strong><\/p>\n<p>The interaction service is <strong>still in preview<\/strong> and the API may change as we refine it further. We\u2019re looking forward to hearing your feedback about it on the <a href=\"https:\/\/github.com\/dotnet\/aspire\">Aspire GitHub<\/a>!<\/p><\/div>\n<h3> Built-in prompting for parameters<\/h3>\n<p>Aspire 9.4 already leverages the new interaction service to collect any missing parameter values defined in your apphost. Instead of expecting every dev on your team to maintain their own local appsettings.development.json or .env file, Aspire will prompt for missing values in the dashboard before starting any resource that needs them. You can even customize parameter descriptions with rich markdown, so anyone who clones and runs your app has clear guidance on what values they need to provide \u2013 and then optionally save those values to their user secrets for non-source-controlled per-project config.<\/p>\n<h2> Easy AI development with GitHub Models and Azure AI Foundry<\/h2>\n<p>Aspire streamlines distributed, complex app dev, and an increasingly popular example of this is AI development. If you\u2019ve been adding agentic workflows, chatbots, or other AI-enabled experiences to your stacks, you know how difficult it is to try different models, wire them up, deploy them (and authenticate to them!) at dev time, and figure out what\u2019s actually happening while you debug. But, AI-enabled apps are really just distributed apps with a new type of container \u2013 an AI model! \u2013 which means Aspire is perfect for streamlining this dev loop.<\/p>\n<p>Aspire 9.4 includes two new AI-focused hosting integrations \u2013 <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/github\/github-models-integration\">GitHub Models (Preview)<\/a> and <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/azureai\/azureai-foundry-integration\">Azure AI Foundry (Preview)<\/a> \u2013 which let you define AI models in your apphost then run them locally or deploy models to develop against. Both integrations work seamlessly with the <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/azureai\/azureai-inference-integration\">Azure AI Inference (Preview) client integration<\/a>, so you get detailed OpenTelemetry traces and simple bootstrapping code for your client app or service implementing it.<\/p>\n<p>This is all the code it takes to define, deploy, and run a new GitHub or Azure AI Foundry model in your apphost:<\/p>\n<p>\/\/ AppHost.cs<br \/>\nvar ai = builder.AddAzureAIFoundry(&#8220;ai&#8221;);<\/p>\n<p>var embedding = ai.AddDeployment(<br \/>\n    name: &#8220;text-embedding&#8221;,<br \/>\n    modelName: &#8220;text-embedding-3-small&#8221;,<br \/>\n    modelVersion: &#8220;1&#8221;,<br \/>\n    format: &#8220;OpenAI&#8221;)<br \/>\n     .WithProperties(d =&gt;<br \/>\n        {<br \/>\n            d.SkuCapacity = 20;<br \/>\n        });<\/p>\n<h2> Yet another resource with ExternalService and the updated YARP integration<\/h2>\n<p>One of my favorite features in 9.4 seems minor, but is a huge quality of life improvement for anyone working with external or third-party APIs. You can now use AddExternalService() to <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/fundamentals\/orchestrate-resources#express-external-service-resources\">model any URL or endpoint as a resource<\/a>, get health status, and reference or configure it the same as any other resource in the apphost.<\/p>\n<p>var externalApi = builder.AddExternalService(&#8220;resource-name&#8221;, &#8220;https:\/\/api.example.com&#8221;);<\/p>\n<p>var frontend = builder.AddNpmApp(&#8220;frontend&#8221;, &#8220;..\/MyJSCodeDirectory&#8221;)<br \/>\n    .WithReference(externalApi);<\/p>\n<p>Many external APIs require some sort of auth or specific headers, versioning, or routes. The preview <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/proxies\/yarp-integration\">YARP integration<\/a> has been updated with fluent transform APIs so you can programmatically define your config in C# with strong types, IntelliSense, and any other Aspire resource config.<\/p>\n<h2> Start using 9.4 today<\/h2>\n<p>There are <em>so many<\/em> more features, integration updates, and quality-of-life improvements that shipped in Aspire 9.4 \u2013 if I tried to cover them all, I\u2019d be reaching <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/performance-improvements-in-net-9\/\">Stephen Toub-level<\/a> post length! You can see a comprehensive list of changes in our <a href=\"https:\/\/learn.microsoft.com\/dotnet\/aspire\/whats-new\/dotnet-aspire-9.4\">What\u2019s New<\/a> doc, and use them now by updating your AppHost.csproj SDK version and packages:<\/p>\n<p>&lt;!&#8211; SDK version &#8211;&gt;<br \/>\n&lt;Sdk Name=&#8221;Aspire.AppHost.Sdk&#8221; Version=&#8221;9.4.0&#8243; \/&gt;<\/p>\n<p>&lt;!&#8211; NuGet package references &#8211;&gt;<br \/>\n&lt;PackageReference Include=&#8221;Aspire.Hosting.AppHost&#8221; Version=&#8221;9.4.0&#8243; \/&gt;<\/p>\n<p>I\u2019m so proud of this release and the incredible amount of work that went into it \u2013 both from the Aspire team and our <a href=\"https:\/\/github.com\/dotnet\/aspire\/pulls?q=is%3Apr+is%3Aclosed+label%3Acommunity-contribution+closed%3A%3E2025-05-30\">community contributors<\/a>. We\u2019re looking forward to hearing your feedback on 9.4 and what you want to see next \u2013 let us know on <a href=\"https:\/\/github.com\/dotnet\/aspire\">GitHub<\/a> and our <a href=\"https:\/\/aka.ms\/dotnet\/aspire\">new Discord server<\/a>. See you there!<\/p>\n<p>The post <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-aspire-9-4\/\">Aspire 9.4 is here with a CLI and interactive dashboard features<\/a> appeared first on <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\">.NET Blog<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Today, we released .NET Aspire 9.4, our biggest release ever, bringing new integrations, interactive dashboard-based inputs, and a standalone, native [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[7],"tags":[],"class_list":["post-2304","post","type-post","status-publish","format-standard","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/2304","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=2304"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/2304\/revisions"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=2304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=2304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=2304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}