Polecenie dotnet run stanowi fundament procesu deweloperskiego w środowisku .NET, oferując programistom zaawansowane możliwości uruchamiania aplikacji bezpośrednio ze źródła oraz zarządzania złożonymi ustawieniami środowiskowymi poprzez profile uruchomieniowe. To rozbudowane narzędzie jest zarówno wygodnym rozwiązaniem do szybkiego programowania iteracyjnego, jak i rozbudowanym mechanizmem orkiestracji budowy, zarządzania zmiennymi środowiskowymi i konfiguracji profilowanych. Elastyczność tej komendy umożliwia obsługę prostych aplikacji konsolowych oraz złożonych serwisów webowych wymagających precyzyjnych kontekstów środowiskowych – dlatego jest nieodzowna we współczesnym .NET.

Podstawowa architektura i kluczowe funkcje polecenia dotnet run

Polecenie dotnet run to wysokopoziomowa abstrakcja, która integruje kilka etapów cyklu życia aplikacji w jeden uproszczony proces. Największą zaletą jest możliwość bezpośredniego uruchamiania aplikacji ze źródła bez ręcznego kompilowania, co eliminuje konieczność samodzielnego zarządzania artefaktami oraz wdrożeniami podczas programowania.

  • integracja procesu budowania i uruchamiania,
  • automatyczne kompilowanie do najnowszej wersji plików wykonywalnych w katalogu bin/<konfiguracja>/<target>,
  • uniknięcie problemów z nieaktualnymi binariami.

Polecenie dotnet run korzysta z infrastruktury dotnet build, ale dodaje własną warstwę zarządzania konfiguracją uruchomienia. Po uruchomieniu następuje kompilacja kodu, a wynikowy plik wykonywalny od razu startuje. Dzięki temu zawsze pracujemy na najświeższej wersji aplikacji.

dotnet run jest ściśle powiązane z .NET CLI – pozwala kontrolować środowisko uruchomieniowe i pełni rolę hosta, który wykrywa punkt wejścia (Main), zarządza zależnościami oraz konfiguracją.

Bardzo ważną cechą jest mechanizm rozwiązywania zależności z wykorzystaniem pamięci podręcznej NuGet, co zapewnia identyczne środowiska na różnych komputerach deweloperskich.

Microsoft rekomenduje używanie dotnet publish do wdrożeń produkcyjnych – dotnet run przeznaczony jest do rozwoju i testów.

Profile uruchomieniowe i launchSettings.json – konfiguracja i zastosowanie

Ważną przewagą ekosystemu .NET jest system profili uruchomieniowych launchSettings.json. Pozwala on tworzyć różne konfiguracje startowe w jednym projekcie. Struktura pliku launchSettings.json wygląda najczęściej tak:

  • sekcja iisSettings – odpowiada za konfigurację IIS Express;
  • sekcja profiles – zawiera indywidualne profile uruchomieniowe, każdy z własną nazwą i konfiguracją;
  • kluczowe parametry w profilu: commandName, environmentVariables, applicationUrl.

commandName określa tryb uruchomienia (np. „Project” dla standalone lub „IISExpress” dla uruchomienia pod IIS Express).

W environmentVariables definiujemy dowolne pary klucz-wartość przekazywane do aplikacji, np. ASPNETCORE_ENVIRONMENT.

applicationUrl wskazuje adres(y), do których aplikacja ma się zbindować – szczególnie ważne dla testów HTTP/HTTPS czy pracy na różnych interfejsach.

Zarządzanie zmiennymi środowiskowymi – hierarchia i priorytety

Zarządzanie zmiennymi środowiskowymi w .NET opiera się na przejrzystej hierarchii priorytetów. Taki podział decyduje, skąd aplikacja pobiera finalne ustawienia:

  • globalne zmienne systemowe – działają na wszystkich aplikacjach w systemie,
  • zmienne użytkownika – do indywidualnej konfiguracji środowiska dewelopera,
  • profile uruchomieniowe (launchSettings.json) – nadpisują poprzednie warstwy,
  • zmienne ustawione podczas uruchomienia (–environment lub przez IDE) – najwyższy priorytet.

DOTNET_LAUNCH_PROFILE informuje o aktywnym profilu uruchomieniowym, co umożliwia profilowane zachowanie aplikacji.

Dla systemów nieobsługujących dwukropka w nazwach zmiennych środowiskowych (.env), stosuje się podwójne podkreślenie (__), by zachować strukturę hierarchii.

Zarządzanie zmiennymi środowiskowymi na różnych platformach

Poniżej przedstawiam porównanie kluczowych metod zarządzania zmiennymi środowiskowymi w zależności od systemu operacyjnego:

System Tymczasowe ustawienie Trwałe ustawienie Typowe lokalizacje .NET
Windows set ASPNETCORE_ENVIRONMENT=Staging setx ASPNETCORE_ENVIRONMENT Staging C:\Program Files\dotnet
PowerShell $Env:ASPNETCORE_ENVIRONMENT = 'Staging' [System.Environment]::SetEnvironmentVariable() C:\Program Files\dotnet
Linux/macOS export ASPNETCORE_ENVIRONMENT=Staging Dodanie do ~/.bash_profile lub ~/.zshrc /usr/local/share/dotnet (macOS)

Zmienna DOTNET_ROOT pozwala wskazać lokalizację środowiska wykonawczego .NET (np. DOTNET_ROOT(x86) dla procesów 32-bitowych).

Integracja ze środowiskiem deweloperskim i wsparcie IDE

Nowoczesne IDE oferują rozbudowaną integrację z profilami uruchomieniowymi, pozwalając na łatwą selekcję i edycję konfiguracji:

  • Visual Studio – umożliwia przełączanie profili przez rozwijane menu i automatyczne zarządzanie zmiennymi (profile są zwykle współdzielone przez repozytorium);
  • Visual Studio Code – wykorzystuje plik launch.json w folderze .vscode, oferując własne mechanizmy konfiguracji niezależne od launchSettings.json;
  • zarządzanie profilem z linii poleceń (np. --launch-profile) i opcja --no-launch-profile pomocna w automatyzacji i CI/CD.

Konfiguracje IDE są indywidualne, a launchSettings.json trafia zwykle do repozytorium dla zapewnienia spójności pracy zespołu.

Zaawansowane scenariusze i dobre praktyki tworzenia profili

Tworzenie profili pozwala zarządzać środowiskami na różnych etapach projektu oraz testować zależności zewnętrzne. Najczęstsze zastosowania to m.in.:

  • unit test – środowisko do testów jednostkowych;
  • integration – profil dla testów integracyjnych;
  • staging – przygotowanie środowiska przed produkcją.

Dla szybko rosnących projektów zaleca się korzystanie z Secret Managera do zarządzania danymi wrażliwymi oraz oznaczanie frameworka przez --framework dla wieloplatformowych wymagań.

Zalecane praktyki podczas pracy z profilami:

  • Optymalizacja hierarchii konfiguracji – określ wartości bazowe na poziomie systemowym, a nadpisania umieszczaj tylko tam, gdzie to niezbędne;
  • Integracja z zewnętrznymi systemami konfiguracji – stosuj profile jako punkt początkowy, dalsza konfiguracja może odbywać się na poziomie chmury lub serwerów konfiguracyjnych;
  • Optymalizacja wydajności – duże projekty lepiej kompilować osobno, a uruchamiać gotowy plik .dll.

Rozwiązywanie problemów i zarządzanie profilami

Dla sprawnego zarządzania profilami i rozwiązywania typowych problemów należy pamiętać o następujących aspektach:

  • Prawidłowe umieszczenie pliku launchSettings.json – plik powinien znajdować się w folderze Properties;
  • Nazewnictwo profili – unikaj spacji i znaków specjalnych, stosuj cudzysłowy w linii poleceń;
  • Hierarchia zmiennych środowiskowych – zrozum, która warstwa ma wyższy priorytet;
  • Weryfikacja zmiennej DOTNET_LAUNCH_PROFILE – sprawdzisz w ten sposób, który profil aktywowałeś;
  • Opcja –verbosity – użyj większego poziomu szczegółowości logów do diagnozy problemów.

Dodatkowe zalecenia usprawniające zarządzanie profilami to:

  • stosowanie opisowych, jednolitych nazw profili,
  • wersjonowanie launchSettings.json z opcją lokalnych nadpisywań,
  • regularny przegląd i aktualizacja profili, by unikać dezaktualizacji.

Profile uruchomieniowe w nowoczesnym DevOps

W nowoczesnych pipelinach DevOps profile uruchomieniowe znajdują zastosowanie nie tylko w testowaniu lokalnym, ale przede wszystkim w automatyzacji CI/CD i powielaniu środowisk:

  • integracja profili z narzędziami CI/CD umożliwia automatyczne odwzorowanie środowisk deweloperskich i testowych,
  • konteneryzacja (Docker) przenosi zmienne środowiskowe do instancji, gwarantując spójność wdrożeń,
  • przy wdrożeniach w chmurze (Azure, AWS, GCP), profile służą do testowania, a właściwa konfiguracja odbywa się na poziomie usług chmurowych.

Mikroserwisy i projekty wielośrodowiskowe korzystają z hierarchii profili, by łatwo mapować różne topologie wdrożeniowe na właściwe parametry uruchomieniowe.

Infrastructure as Code integruje profile uruchomieniowe z systemami takimi jak Terraform czy Kubernetes, minimalizując rozbieżności konfiguracji.

Bezpieczeństwo profili i zarządzanie konfiguracją

Pliki konfiguracyjne, w tym launchSettings.json, nie powinny zawierać informacji wrażliwych. Wszelkie hasła, klucze czy tokeny obsługuj przez Secret Managera lub dedykowane systemy zarządzania sekretami.

  • integracja z Secret Managerem – klucze podawane w profilach są pobierane dynamicznie, co poprawia bezpieczeństwo;
  • aplikacje multi-tenant – wymagają wydzielenia profili na tenantów i odpowiedniej kontroli dostępu do katalogów z profilami;
  • kontrola auditowa – logowanie zmiennej DOTNET_LAUNCH_PROFILE ułatwia weryfikację zgodności z politykami bezpieczeństwa.

Kierunki rozwoju profili uruchomieniowych

Rola profili uruchomieniowych w .NET ewoluuje zgodnie z rozwojem środowisk chmurowych oraz automatyzacją. Oto główne trendy i nowe scenariusze zastosowania:

  • standaryzacja profili w chmurze przez narzędzia jak Codespaces czy kontenery deweloperskie;
  • centralne zarządzanie parametrami AI/ML przez rozbudowane profile uruchomieniowe;
  • automatyczna synchronizacja profili (GitOps) – minimalizuje różnice środowiskowe między deweloperami i produkcją;
  • wsparcie dla edge computing i IoT poprzez rozszerzanie mechanizmów profili o obsługę specyficznych środowisk sprzętowych.