<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Softinbit</title>
    <description>The latest articles on DEV Community by Softinbit (@softinbit).</description>
    <link>https://dev.to/softinbit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4207303%2F4c964275-8b62-4af3-aebb-040221dbfabd.png</url>
      <title>DEV Community: Softinbit</title>
      <link>https://dev.to/softinbit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/softinbit"/>
    <language>en</language>
    <item>
      <title>Setting Up a .NET Developer Machine That Just Works</title>
      <dc:creator>Softinbit</dc:creator>
      <pubDate>Thu, 29 Oct 2026 19:45:32 +0000</pubDate>
      <link>https://dev.to/softinbit/setting-up-a-net-developer-machine-that-just-works-2gmo</link>
      <guid>https://dev.to/softinbit/setting-up-a-net-developer-machine-that-just-works-2gmo</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: this article was drafted with AI assistance and reviewed by Softinbit Technology before publishing. It is part of the series &lt;a href="https://www.softinbit.com/zero-to-full-stack-dotnet?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=series" rel="noopener noreferrer"&gt;Zero to Full-Stack .NET&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Install the SDK, a database, Git, and Node once, pin them per repository, and stop losing your first week to "it works on my machine".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part 1 of the "Zero to Full-Stack .NET" series. Section: Getting Started.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the .NET 10 SDK and pin each repository's SDK with &lt;code&gt;global.json&lt;/code&gt;, so a teammate's preview install never changes your build.&lt;/li&gt;
&lt;li&gt;Run a throwaway SQL Server in Docker or LocalDB, and trust the local HTTPS certificate once with &lt;code&gt;dotnet dev-certs https --trust&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Finish with a console app, a Web API, &lt;code&gt;.http&lt;/code&gt; smoke tests, and a dotnet CLI cheat sheet you will use every day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Level:&lt;/strong&gt; Beginner · &lt;strong&gt;Prerequisites:&lt;/strong&gt; A Windows, macOS, or Linux machine where you can install software · &lt;strong&gt;Reading time:&lt;/strong&gt; 10 min&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is your first Monday. You clone the project, open it, and press Build. The output says the project targets a .NET version you do not have. You install something, try again, and now the app starts but crashes because it cannot reach SQL Server. You fix that, open the browser, and get a red "Your connection is not private" warning on localhost.&lt;/p&gt;

&lt;p&gt;None of this is a real bug. It is a machine that was never set up. The team has been working on their laptops for years and nobody remembers which tools they installed, so the onboarding document is three lines long and two of them are wrong.&lt;/p&gt;

&lt;p&gt;This article is the setup I wish someone had handed me. It goes in the order you will hit the problems, and every step ends with a command you can run to prove it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you will be able to do after this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Install the current .NET SDK and pin the version a repository uses with &lt;code&gt;global.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run SQL Server locally in Docker or as LocalDB and connect to it from a query tool&lt;/li&gt;
&lt;li&gt;Trust the local HTTPS certificate so &lt;code&gt;https://localhost&lt;/code&gt; stops warning&lt;/li&gt;
&lt;li&gt;Create, run, and test a console app and a Web API from the command line&lt;/li&gt;
&lt;li&gt;Use a dotnet CLI cheat sheet instead of clicking through menus&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing the SDK and pinning it per repository
&lt;/h2&gt;

&lt;p&gt;Download the SDK (not just the runtime) for the current LTS release from the .NET download page on dot.net. LTS means long-term support: it is the version most teams target because it receives fixes for three years. .NET 8 and .NET 10 are both LTS releases; pick the one your team uses, or .NET 10 if you are starting fresh (.NET 8 support ends in November 2026).&lt;/p&gt;

&lt;p&gt;Check what you have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet &lt;span class="nt"&gt;--list-sdks&lt;/span&gt;
&lt;span class="c"&gt;# 8.0.xxx [C:\Program Files\dotnet\sdk]&lt;/span&gt;
&lt;span class="c"&gt;# 10.0.xxx [C:\Program Files\dotnet\sdk]&lt;/span&gt;
dotnet &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# prints the SDK that will be used in the current folder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Having several SDKs installed is normal. The surprise is which one &lt;code&gt;dotnet build&lt;/code&gt; picks: without any configuration, it uses the newest one on the machine. That is fine until a teammate installs a preview and a build starts behaving differently. The fix is a &lt;code&gt;global.json&lt;/code&gt; at the root of the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sdk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.0.100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rollForward"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"latestFeature"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;rollForward: latestFeature&lt;/code&gt; means "use 8.0.100 or any newer 8.0.x feature band, but never jump to 9 or 10". You can generate the file instead of typing it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new globaljson &lt;span class="nt"&gt;--sdk-version&lt;/span&gt; 8.0.100 &lt;span class="nt"&gt;--roll-forward&lt;/span&gt; latestFeature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;dotnet --version&lt;/code&gt; inside the repo afterwards. If it prints an error saying the requested SDK was not found, you now know exactly what to install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing an editor
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Editor&lt;/th&gt;
&lt;th&gt;Pick it when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visual Studio Community (2026 for .NET 10; 2022 supports up to .NET 9)&lt;/td&gt;
&lt;td&gt;You are on Windows, you want the strongest debugger, designers for Windows Forms, and SQL Server tooling built in. Free for individuals, open source, and small teams.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code with the C# Dev Kit extension&lt;/td&gt;
&lt;td&gt;You are on macOS or Linux, you also write Angular or Node, or you want a lighter editor. Install "C# Dev Kit"; it pulls in the C# extension and adds a solution explorer and a test runner.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both are fine. Many teams use Visual Studio for the API and VS Code for the frontend folder of the same repository. When you install Visual Studio, select the "ASP.NET and web development" workload and, if you will touch desktop tools, ".NET desktop development".&lt;/p&gt;

&lt;h2&gt;
  
  
  SQL Server for development
&lt;/h2&gt;

&lt;p&gt;You need a SQL Server you can break without consequences. There are two good options.&lt;/p&gt;

&lt;p&gt;Docker works on every OS and is the easiest to reset. Install Docker Desktop (on Windows, with the WSL 2 backend), then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"ACCEPT_EULA=Y"&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MSSQL_SA_PASSWORD=Dev_Passw0rd"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 1433:1433 &lt;span class="nt"&gt;--name&lt;/span&gt; sqldev &lt;span class="nt"&gt;-d&lt;/span&gt; mcr.microsoft.com/mssql/server:2022-latest
&lt;span class="c"&gt;# check it stayed up&lt;/span&gt;
docker ps
&lt;span class="c"&gt;# if it is missing, read why&lt;/span&gt;
docker logs sqldev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The password for the &lt;code&gt;sa&lt;/code&gt; (system administrator) account must meet SQL Server's complexity rules: at least eight characters, using three of the four groups uppercase, lowercase, digits, and symbols. If it does not, the container exits within seconds and &lt;code&gt;docker ps&lt;/code&gt; shows nothing. &lt;code&gt;docker logs&lt;/code&gt; tells you.&lt;/p&gt;

&lt;p&gt;On Windows without Docker, install SQL Server Express, or use LocalDB, which comes with SQL Server Express and as an optional Visual Studio component. LocalDB is a tiny on-demand instance that starts when you connect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqllocaldb info
&lt;span class="c"&gt;# MSSQLLocalDB&lt;/span&gt;
sqllocaldb start MSSQLLocalDB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connection strings for the two setups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker:  Server=localhost,1433;Database=Store;User Id=sa;Password=Dev_Passw0rd;TrustServerCertificate=True
LocalDB: Server=(localdb)\MSSQLLocalDB;Database=Store;Trusted_Connection=True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;TrustServerCertificate=True&lt;/code&gt; is needed for the container because recent SqlClient versions encrypt by default and the container's certificate is self-signed.&lt;/p&gt;

&lt;p&gt;To look at tables and run queries, install SQL Server Management Studio (SSMS, Windows only) or, on any OS, VS Code with the MSSQL extension. Azure Data Studio was the older cross-platform option; Microsoft has retired it, so prefer the VS Code extension for new installs. Connect with the values above and run &lt;code&gt;SELECT @@VERSION&lt;/code&gt; to confirm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git and a GitHub account
&lt;/h2&gt;

&lt;p&gt;Install Git from git-scm.com (on Windows, keep the default "Git from the command line" option). Then tell Git who you are, because every commit is stamped with it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"you@example.com"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; init.defaultBranch main
git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a GitHub account if you do not have one and set up authentication. The simplest path is the GitHub CLI: &lt;code&gt;gh auth login&lt;/code&gt; walks you through a browser login and configures Git to use it. Your team may use Azure DevOps or GitLab instead; the Git commands are identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Node.js for the frontend you will write later
&lt;/h2&gt;

&lt;p&gt;Angular, and most frontend tooling, run on Node.js. Do not install Node from the plain installer; use a version manager so you can switch when a project needs a different version. On Windows that is nvm-windows (the &lt;code&gt;nvm-windows&lt;/code&gt; project by coreybutler on GitHub):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;lts
nvm use lts
node &lt;span class="nt"&gt;--version&lt;/span&gt;
npm &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On macOS or Linux use &lt;code&gt;nvm&lt;/code&gt; from the nvm-sh project; there the commands are &lt;code&gt;nvm install --lts&lt;/code&gt; and &lt;code&gt;nvm use --lts&lt;/code&gt;. You do not need Angular today. When you do, &lt;code&gt;npm install -g @angular/cli&lt;/code&gt; is one line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trusting the HTTPS development certificate
&lt;/h2&gt;

&lt;p&gt;When you run a Web API, Kestrel (the built-in web server) serves &lt;code&gt;https://localhost:xxxx&lt;/code&gt; with a self-signed certificate. Browsers reject it until you tell the operating system to trust it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet dev-certs https &lt;span class="nt"&gt;--trust&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Windows and macOS show a confirmation dialog. On Linux, trust stores differ by distribution and browser, so depending on your SDK version the command may only print instructions; follow them. If something is broken, &lt;code&gt;dotnet dev-certs https --clean&lt;/code&gt; followed by the trust command again fixes almost every case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first console app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new console &lt;span class="nt"&gt;-n&lt;/span&gt; Store.Tools
&lt;span class="nb"&gt;cd &lt;/span&gt;Store.Tools
dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;Program.cs&lt;/code&gt;. The template uses top-level statements: there is no &lt;code&gt;class Program&lt;/code&gt; or &lt;code&gt;Main&lt;/code&gt;, just code. Replace the contents with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Ayşe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Mehmet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Zeynep"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Merhaba, &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dotnet run&lt;/code&gt; prints three greetings. If it does, the SDK, the compiler, and your terminal all work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first Web API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new webapi &lt;span class="nt"&gt;-n&lt;/span&gt; Store.Api
&lt;span class="nb"&gt;cd &lt;/span&gt;Store.Api
dotnet run &lt;span class="nt"&gt;--launch-profile&lt;/span&gt; https
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In .NET 8 and later this template creates a minimal API: endpoints are defined directly in &lt;code&gt;Program.cs&lt;/code&gt; with &lt;code&gt;app.MapGet(...)&lt;/code&gt;. If your team uses controllers, add &lt;code&gt;--use-controllers&lt;/code&gt; to the &lt;code&gt;new&lt;/code&gt; command. .NET 9 replaced the Swagger UI package with built-in OpenAPI document generation, so do not be surprised when a newer template has no &lt;code&gt;/swagger&lt;/code&gt; page.&lt;/p&gt;

&lt;p&gt;Plain &lt;code&gt;dotnet run&lt;/code&gt; uses the first profile in &lt;code&gt;Properties/launchSettings.json&lt;/code&gt;, which in the template is &lt;code&gt;http&lt;/code&gt;, so you would only get &lt;code&gt;http://localhost:5xxx&lt;/code&gt;. With &lt;code&gt;--launch-profile https&lt;/code&gt; the console prints both URLs, typically &lt;code&gt;https://localhost:7xxx&lt;/code&gt; and &lt;code&gt;http://localhost:5xxx&lt;/code&gt;. Add a small endpoint below the existing ones (above &lt;code&gt;app.Run()&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MapGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Klavye"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1299.90m&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Price&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;449.50m&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test it without a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing HTTP requests from your editor
&lt;/h2&gt;

&lt;p&gt;Visual Studio and VS Code (with the REST Client extension) both understand &lt;code&gt;.http&lt;/code&gt; files, and the .NET 8 template already creates &lt;code&gt;Store.Api.http&lt;/code&gt; next to the project. Replace its contents with this, using the HTTPS port &lt;code&gt;dotnet run --launch-profile https&lt;/code&gt; printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@baseUrl = https://localhost:7001

GET {{baseUrl}}/products
Accept: application/json

###

GET {{baseUrl}}/weatherforecast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click "Send Request" above a request and the response opens beside it. The file is plain text, so it goes into Git and the whole team shares the same smoke tests. Postman does the same job with a richer UI if you prefer it; export the collection into the repository so it is not trapped in one person's account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dotnet CLI cheat sheet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new list                                  &lt;span class="c"&gt;# see available templates&lt;/span&gt;
dotnet new sln &lt;span class="nt"&gt;-n&lt;/span&gt; Store                          &lt;span class="c"&gt;# create a solution&lt;/span&gt;
dotnet sln add Store.Api/Store.Api.csproj        &lt;span class="c"&gt;# add a project to it&lt;/span&gt;
dotnet restore                                   &lt;span class="c"&gt;# download NuGet packages&lt;/span&gt;
dotnet build                                     &lt;span class="c"&gt;# compile&lt;/span&gt;
dotnet run &lt;span class="nt"&gt;--project&lt;/span&gt; Store.Api                   &lt;span class="c"&gt;# run a project from the solution folder&lt;/span&gt;
dotnet watch &lt;span class="nt"&gt;--project&lt;/span&gt; Store.Api                 &lt;span class="c"&gt;# rebuild and restart on every save&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt;                                      &lt;span class="c"&gt;# run all tests in the solution&lt;/span&gt;
dotnet add Store.Api package Serilog.AspNetCore  &lt;span class="c"&gt;# add a NuGet package to a project&lt;/span&gt;
dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; dotnet-ef                 &lt;span class="c"&gt;# install a global tool&lt;/span&gt;
dotnet format                                    &lt;span class="c"&gt;# apply code style from .editorconfig&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commands run against the project in the current folder unless you pass &lt;code&gt;--project&lt;/code&gt;. Keeping a terminal open next to the editor is faster than the menus once you know these.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools and what each one is for
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.NET SDK&lt;/td&gt;
&lt;td&gt;Compiler, runtime, and the &lt;code&gt;dotnet&lt;/code&gt; CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual Studio or VS Code with C# Dev Kit&lt;/td&gt;
&lt;td&gt;Editing and debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Desktop with the SQL Server image, or LocalDB&lt;/td&gt;
&lt;td&gt;A throwaway database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSMS or VS Code with the MSSQL extension&lt;/td&gt;
&lt;td&gt;Browsing tables and running T-SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git and the GitHub CLI&lt;/td&gt;
&lt;td&gt;Version control and pull requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nvm-windows and Node.js LTS&lt;/td&gt;
&lt;td&gt;Frontend tooling and the Angular CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.http&lt;/code&gt; files or Postman&lt;/td&gt;
&lt;td&gt;Calling your API by hand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dotnet-ef&lt;/code&gt; global tool&lt;/td&gt;
&lt;td&gt;EF Core migrations from the command line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Several SDKs and no &lt;code&gt;global.json&lt;/code&gt;. The build silently picks the newest SDK and behaves differently on each machine. Add &lt;code&gt;global.json&lt;/code&gt; and commit it.&lt;/li&gt;
&lt;li&gt;Cloning into a OneDrive, Dropbox, or Google Drive folder. The sync client locks files in &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt; mid-build and you get random "file in use" errors. Clone to &lt;code&gt;C:\src&lt;/code&gt; or &lt;code&gt;~/src&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Running Visual Studio as administrator out of habit. Files and certificates created under admin become unreadable from a normal terminal. Run it as your own user; nothing in a normal web project needs elevation.&lt;/li&gt;
&lt;li&gt;Committing &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt;. They are build output, change on every build, and cause merge conflicts. Run &lt;code&gt;dotnet new gitignore&lt;/code&gt; in the repository root before the first commit.&lt;/li&gt;
&lt;li&gt;Skipping &lt;code&gt;dotnet dev-certs https --trust&lt;/code&gt;. Every browser warning and every &lt;code&gt;HttpClient&lt;/code&gt; call to your own API fails with a certificate error. One command fixes it.&lt;/li&gt;
&lt;li&gt;Port 1433 already taken. A previously installed SQL Server Express is listening, so the Docker container cannot bind. Either stop the Windows service or map the container to another port with &lt;code&gt;-p 14333:1433&lt;/code&gt; and use &lt;code&gt;localhost,14333&lt;/code&gt; in the connection string.&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;sa&lt;/code&gt; password that fails the complexity rules. The container starts, fails validation, and exits. &lt;code&gt;docker logs sqldev&lt;/code&gt; shows the message; pick a longer password with mixed character types.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dotnet --list-sdks&lt;/code&gt; shows the SDK the team targets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;global.json&lt;/code&gt; exists in the repository root and &lt;code&gt;dotnet --version&lt;/code&gt; matches it&lt;/li&gt;
&lt;li&gt;SQL Server answers &lt;code&gt;SELECT @@VERSION&lt;/code&gt; from SSMS or VS Code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dotnet dev-certs https --trust&lt;/code&gt; ran without errors&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git config --global user.name&lt;/code&gt; and &lt;code&gt;user.email&lt;/code&gt; are set&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;node --version&lt;/code&gt; prints an LTS version installed through nvm&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dotnet run --launch-profile https&lt;/code&gt; in a fresh &lt;code&gt;webapi&lt;/code&gt; project serves &lt;code&gt;/weatherforecast&lt;/code&gt; over HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.gitignore&lt;/code&gt; from &lt;code&gt;dotnet new gitignore&lt;/code&gt; is committed before &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt; ever are&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;With a machine that builds and a database that answers, the next article, "Thinking Like a Programmer: Turning a Vague Request Into Working Code", takes a one-sentence request from a product owner and turns it into a small, tested C# program. After that, "Git for Daily Work: Branches, Pull Requests, and Fixing Mistakes" covers the version control habits that keep a team from overwriting each other.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.softinbit.com/zero-to-full-stack-dotnet/setting-up-a-dotnet-developer-machine?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=setting-up-a-dotnet-developer-machine" rel="noopener noreferrer"&gt;www.softinbit.com&lt;/a&gt;. Part of &lt;a href="https://www.softinbit.com/zero-to-full-stack-dotnet?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=series" rel="noopener noreferrer"&gt;Zero to Full-Stack .NET&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>developertools</category>
      <category>gettingstarted</category>
    </item>
  </channel>
</rss>
