Start Debugging

.NET 11 Preview 3: dotnet run -e setzt Umgebungsvariablen ohne Launch Profiles

dotnet run -e in .NET 11 Preview 3 übergibt Umgebungsvariablen direkt aus der CLI und zeigt sie als MSBuild RuntimeEnvironmentVariable-Items an.

.NET 11 Preview 3 wurde am 14. April 2026 mit einer kleinen, aber breit anwendbaren SDK-Änderung ausgeliefert: dotnet run akzeptiert jetzt -e KEY=VALUE, um Umgebungsvariablen direkt von der Kommandozeile zu übergeben. Keine Shell-Exports, keine launchSettings.json-Edits, keine einmaligen Wrapper-Skripte.

Warum das Flag zählt

Vor Preview 3 hieß das Setzen einer Env-Variablen für einen einzelnen Lauf eine von drei unbequemen Optionen. Auf Windows hatten Sie set ASPNETCORE_ENVIRONMENT=Staging && dotnet run mit den Quoting-Überraschungen von cmd.exe. In bash hatten Sie ASPNETCORE_ENVIRONMENT=Staging dotnet run, was funktioniert, aber die Variable in jeden Child-Prozess blutet, der aus der Shell forkt. Oder Sie fügten noch ein weiteres Profile in Properties/launchSettings.json hinzu, das sonst niemand im Team wirklich wollte.

dotnet run -e übernimmt diesen Job und hält den Scope auf den Lauf selbst begrenzt.

Die Syntax und was sie tatsächlich setzt

Übergeben Sie ein -e pro Variable. Sie können das Flag so oft wiederholen, wie Sie brauchen:

dotnet run -e ASPNETCORE_ENVIRONMENT=Development -e LOG_LEVEL=Debug

Das SDK injiziert diese Werte in das Environment des gestarteten Prozesses. Ihre App sieht sie über Environment.GetEnvironmentVariable oder die ASP.NET-Core-Konfigurationspipeline wie jede andere Variable:

var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Console.WriteLine($"Running as: {env}");

Es gibt einen zweiten, weniger offensichtlichen Nebeneffekt, den man kennen sollte: Dieselben Variablen werden MSBuild als RuntimeEnvironmentVariable-Items zur Verfügung gestellt. Das heißt, Targets, die während der Build-Phase von dotnet run laufen, können sie ebenfalls lesen, was Szenarien wie das Gaten von Code-Generierung an einem Flag oder das Tauschen von Resource-Files pro Umgebung ermöglicht.

RuntimeEnvironmentVariable-Items aus einem Target lesen

Wenn Sie ein Custom Target haben, das auf das Flag reagieren soll, zählen Sie die Items auf, die MSBuild bereits befüllt hat:

<Target Name="LogRuntimeEnvVars" BeforeTargets="Build">
  <Message Importance="high"
           Text="Runtime env: @(RuntimeEnvironmentVariable->'%(Identity)=%(Value)', ', ')" />
</Target>

Laufen Sie dotnet run -e FEATURE_X=on -e TENANT=acme, und das Target druckt FEATURE_X=on, TENANT=acme bevor die App startet. Das sind reguläre MSBuild-Items, also können Sie sie mit Condition filtern, in andere Properties einspeisen oder nutzen, um Include/Exclude-Entscheidungen innerhalb desselben Builds zu steuern.

Wo es in den Workflow passt

dotnet run -e ist kein Ersatz für launchSettings.json. Launch Profiles machen weiter Sinn für die üblichen Konfigurationen, die Sie jeden Tag treffen, und für Debug-Szenarien in Visual Studio oder Rider. Das CLI-Flag ist am besten für One-Shot-Fälle: einen Bug reproduzieren, den jemand unter einem bestimmten LOG_LEVEL gemeldet hat, ein Feature Flag testen, ohne ein Profile zu committen, oder einen schnellen CI-Step in dotnet watch verdrahten, ohne ein YAML-File umzuschreiben.

Eine kleine Einschränkung: Werte mit Leerzeichen oder shell-speziellen Zeichen brauchen immer noch Quoting für Ihre Shell. dotnet run -e "GREETING=hello world" ist in bash und PowerShell in Ordnung, dotnet run -e GREETING="hello world" funktioniert in cmd.exe. Das SDK selbst akzeptiert die Zuweisung wie sie ist, aber die Shell parst die Kommandozeile zuerst.

Das kleinste .NET-11-Preview-3-Feature auf Papier und wahrscheinlich eines der meistgenutzten in der Praxis. Vollständige Release Notes leben unter What’s new in the SDK and tooling for .NET 11, und der Ankündigungs-Post ist im .NET Blog.

< Zurück