{"id":5284,"date":"2026-10-15T17:22:25","date_gmt":"2026-10-15T17:22:25","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/10\/15\/introducing-dotnetup-a-toolchain-manager-for-net\/"},"modified":"2026-10-15T17:22:25","modified_gmt":"2026-10-15T17:22:25","slug":"introducing-dotnetup-a-toolchain-manager-for-net","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/10\/15\/introducing-dotnetup-a-toolchain-manager-for-net\/","title":{"rendered":"Introducing dotnetup: A toolchain manager for .NET"},"content":{"rendered":"<p>Getting started with .NET on macOS and Linux has historically meant navigating a plethora of options: system package managers like <code>apt<\/code> or <code>brew<\/code>, platform-specific tarballs, or standalone shell scripts like <code>dotnet-install.sh<\/code>. While those methods have served us well, they often collide with administrative permissions, leave files scattered across root directories, or make keeping multiple runtime versions side-by-side more awkward than it should be.<\/p>\n<p>That\u2019s why we\u2019re introducing the public preview of <code>dotnetup<\/code>, a new .NET toolchain manager built to install, manage, and update .NET SDKs and runtimes directly in your user account.<\/p>\n<h2>Why dotnetup?<\/h2>\n<p>If you\u2019ve spent time in ecosystems like Rust (<code>rustup<\/code>) or Node (<code>nvm<\/code>), you\u2019re already familiar with the power of a dedicated toolchain manager. The core goal of <code>dotnetup<\/code> is to drastically reduce concept count and friction when getting a .NET environment running:<\/p>\n<ul>\n<li><strong>Consistent ux<\/strong>: The same commands and tools across every platform, regardless of the details of the installation<\/li>\n<li><strong>Non-admin by default<\/strong>: Everything lives comfortably in user-owned folders, not system-owned \u2013 meaning zero need for elevated permissions.<\/li>\n<li><strong>Side-by-side runtime management<\/strong>: Keep multiple servicing versions, preview channels, and daily builds installed at once without them stepping on each other\u2019s toes.<\/li>\n<li><strong>Track intent<\/strong>: Instead of managing versions, track majors or feature bands and let the tools keep you updated each month<\/li>\n<li><strong>Respect for project pinning<\/strong>: Works seamlessly with your existing <code>global.json<\/code> files so team builds remain predictable and deterministic.<\/li>\n<\/ul>\n<p>Let\u2019s walk through how to get started and how to use <code>dotnetup<\/code> for common day-to-day tasks.<\/p>\n<h2>Installing dotnetup and getting started<\/h2>\n<p>To get <code>dotnetup<\/code> on macOS or Linux, run the bootstrap script in your terminal:<\/p>\n<p><strong>macOS (Zsh):<\/strong><\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/aka.ms\/dotnetup\/get-dotnetup.sh | zsh<\/code><\/pre>\n<p><strong>Linux (Bash):<\/strong><\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/aka.ms\/dotnetup\/get-dotnetup.sh | bash<\/code><\/pre>\n<p><strong>PowerShell (<code>pwsh<\/code>):<\/strong><\/p>\n<pre><code class=\"language-powershell\">irm https:\/\/aka.ms\/dotnetup\/get-dotnetup.ps1 | iex<\/code><\/pre>\n<p>Once the script pulls down the binary, initialize your environment:<\/p>\n<pre><code class=\"language-bash\">dotnetup init<\/code><\/pre>\n<p>The <code>init<\/code> command sets up your shell profile so that <code>dotnet<\/code> is immediately available in your terminal sessions and fetches the latest stable .NET SDK.<\/p>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"640\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-get-started.mp4\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-get-started.mp4<\/a><\/video><\/div>\n<p>Let\u2019s check what\u2019s installed in our local environment:<\/p>\n<pre><code class=\"language-bash\">dotnetup list<\/code><\/pre>\n<p>You\u2019ll see a clean inventory of the SDKs and runtimes currently managed by <code>dotnetup<\/code> right in your home folder.<\/p>\n<h2>Keeping runtimes fresh month-over-month<\/h2>\n<p>Every month the .NET team ships servicing updates with security fixes and quality improvements. Keeping your local dev machine up to date helps you build and test against those fixes. For self-contained applications, you also need to republish and redeploy with the updated runtime. Updating your machine does not patch applications you have already shipped.<\/p>\n<p>When using system installs, you may not be in control of your ability to update. With <code>dotnetup<\/code>, staying current is a one-liner:<\/p>\n<pre><code class=\"language-bash\">dotnetup update<\/code><\/pre>\n<p>This command resolves your tracked SDK and runtime channels again and installs the latest matching versions. For example, <code>10.0<\/code> tracks updates within .NET 10, while <code>latest<\/code> follows the latest stable SDK, including new major releases. Exact-version requirements stay pinned, so an installation requested as <code>10.0.3<\/code> will not advance during an update.<\/p>\n<p>If you only want to install or refresh a specific runtime flavor, like the ASP.NET Core runtime on .NET 10, you can target it cleanly:<\/p>\n<pre><code class=\"language-bash\">dotnetup runtime install aspnetcore@10.0<\/code><\/pre>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"640\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-update-runtimes.mp4\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-update-runtimes.mp4<\/a><\/video><\/div>\n<p>After a successful update, <code>dotnetup<\/code> automatically removes installed components that no remaining requirement needs. Versions that another channel or exact-version requirement still needs stay installed.<\/p>\n<p>When you no longer need a tracked channel or exact version, remove that requirement with the corresponding <code>sdk uninstall<\/code> or <code>runtime uninstall<\/code> command. <code>dotnetup<\/code> then cleans up the installations that are no longer needed. See <a href=\"https:\/\/learn.microsoft.com\/dotnet\/core\/tools\/dotnetup\/usecases\/update-installations\">updating tracked installations<\/a> for more details.<\/p>\n<h2>Testing nightly and preview builds<\/h2>\n<p>Beyond routine monthly servicing, many developers want to test bug fixes or check out new runtime capabilities before they hit stable release channels. Previously, testing a nightly runtime build meant hunting down raw installer tarballs from GitHub, manually unpacking them into custom directories, and tweaking environment variables by hand.<\/p>\n<p><code>dotnetup<\/code> treats previews and nightlies as first-class citizens. You can install preview SDKs side-by-side with your stable setup:<\/p>\n<pre><code class=\"language-bash\">dotnetup sdk install preview<\/code><\/pre>\n\n<div class=\"wp-video\"><video class=\"wp-video-shortcode\" width=\"640\" height=\"360\" preload=\"none\" controls=\"controls\"><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-nightly-install.mp4\">https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2026\/10\/dotnetup-nightly-install.mp4<\/a><\/video><\/div>\n<p>Or pull down the latest daily runtime build to verify an issue fix:<\/p>\n<pre><code class=\"language-bash\">dotnetup runtime install daily<\/code><\/pre>\n<p>Or grab an entire SDK to check out the entire toolchain:<\/p>\n<pre><code class=\"language-bash\">dotnetup sdk install daily<\/code><\/pre>\n<p>You get the flexibility to test daily builds across your user account and clean them up easily!<\/p>\n<h2>Updating <code>dotnetup<\/code> itself<\/h2>\n<p>We\u2019ll be pushing features and fixes to <code>dotnetup<\/code> over time, and you can get them easily:<\/p>\n<pre><code class=\"language-bash\">dotnetup self update<\/code><\/pre>\n<h2>Common questions<\/h2>\n<p>Here are quick answers to a few questions you might have:<\/p>\n<h3>I could do all of this with <code>dotnet-install.[sh|ps1]<\/code><\/h3>\n<p>That\u2019s not a question.<\/p>\n<p>But yeah, you could do <em>most<\/em> of this with the install scripts.<br \/>\nWhat you miss out on is<\/p>\n<ul>\n<li><em>management<\/em> of the installed SDKs and Runtimes<\/li>\n<li>signature and checksum validation of the installed SDKs and Runtimes<\/li>\n<li>faster installation of multiple SDKs and Runtimes<\/li>\n<li>a unified CLI surface for doing this on every platform<\/li>\n<\/ul>\n<h3>Does dotnetup need sudo or root rights?<\/h3>\n<p>Nope. <code>dotnetup<\/code> is currently built for non-admin, user-local operation. All SDKs, runtimes, and metadata live entirely within your user directory.<\/p>\n<p>In a future release we\u2019ll be adding support for managing the system-level installs on Windows because of how prevalent those<br \/>\nare on that operating system.<\/p>\n<h3>Can I use dotnetup in CI pipelines?<\/h3>\n<p>Absolutely. Because <code>dotnetup<\/code> doesn\u2019t require root privileges and runs smoothly non-interactively, it\u2019s a great fit for containerized or ephemeral CI workers where you need to spin up specific SDK or nightly runtime versions on the fly.<\/p>\n<h3>What\u2019s on the roadmap for <code>dotnetup<\/code>?<\/h3>\n<p>As mentioned, we\u2019ll be looking into support for Windows admin<br \/>\ninstallers, but we also want to integrate <code>dotnetup<\/code> into CI\/CD systems<br \/>\nlike GitHub Actions and Azure DevOps \u2013 ideally through replacing parts of the implementations of those tools today that rely on the dotnet-install scripts.<\/p>\n<p>We also want to iterate on the user experience to better fit how<br \/>\nyou all use the tool, and flesh out agent skills so that automated<br \/>\nassistants use the tooling more naturally and reach for it by default.<\/p>\n<h3>Where should I go for more details?<\/h3>\n<p>For the full CLI reference, advanced configuration options, and deep dives, head over to the <a href=\"https:\/\/learn.microsoft.com\/dotnet\/core\/tools\/dotnetup\">dotnetup documentation on Microsoft Learn<\/a>.<\/p>\n<p>If you have feedback, run into bugs, or want to share your thoughts on the experience, please drop by the <a href=\"https:\/\/github.com\/dotnet\/sdk\/discussions\/categories\/dotnetup\">dotnet\/sdk discussions on GitHub<\/a>. We\u2019d love to hear how it works for you, or how we can make it better!<\/p>\n<p>The post <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/introducing-dotnetup\/\">Introducing dotnetup: A toolchain manager for .NET<\/a> appeared first on <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\">.NET Blog<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Getting started with .NET on macOS and Linux has historically meant navigating a plethora of options: system package managers like [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":94,"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-5284","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/5284","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"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=5284"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/5284\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/94"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=5284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=5284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=5284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}