Ich habe eine ASP.NET Core-Anwendung (Web Api). In der Dokumentation wurde Arbeiten mit mehreren Umgebungen erläutert, jedoch wurde nicht erläutert, wie aspnetcore_environment
beim Veröffentlichen der Website festgelegt wird.
Lassen Sie uns sagen, wenn ich 3 Umgebungen Development
, Staging
und Production
habe
In der klassischen ASP.NET-Webanwendung wurden drei Build-Konfigurationen erstellt. Development
, Staging
und Production
(wie in der Abbildung unten gezeigt). und dann 3 .pubxml
-Dateien, eine für jede Konfiguration. Muss ich den gleichen Ansatz auch für ASP.NET Core
-Anwendung verwenden?
Wie lege ich aspnetcore_environment
in der .pubxml
-Datei fest?
Wenn der in Frage 1 angegebene Ansatz veraltet ist, wie lautet dann der alternative Ansatz? (Ich benutze Jenkins für CI)
Update 1
Ich verstehe, dass ich ASPNETCORE_ENVIRONMENT
einstellen muss, aber ich kann nicht verstehen, wo wir das einstellen? Während der Entwicklung kann ich dies in launchSettings.json
im Profil festlegen. Die Frage war jedoch, wie wir dies beim Publizieren als Inszenierung oder Produktion festlegen. setzen wir die Umgebungsvariable auf dem Zielserver selbst?
Update 2
Ich habe den Artikel hier gefunden, in dem die verschiedenen Möglichkeiten zum Einstellen der Umgebungsvariablen erläutert werden. Dies hat meine Frage teilweise beantwortet. Beim Veröffentlichen der Anwendung berücksichtigt der Veröffentlichungsprozess jedoch nicht die Umgebungsvariable, während appsettings.{env.EnvironmentName}.json
veröffentlicht wird.
Ich habe für diese Frage ein separates Post erstellt
Beim Hosten der Anwendung unter IIS können Sie die Umgebungsvariable in web.config festlegen.
https://docs.Microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Um es beim Publizieren zu generieren, fügen Sie eine web.config zum Stamm Ihres Projekts hinzu. "Dotnet publish" verwendet diese Datei als Grundlage für die im Veröffentlichungsordner generierte. Dann können Sie den Wert in Ihrem Implementierungssystem ändern.
<?xml version="1.0" encoding="utf-8" ?>
<!-- Used to overwrite settings web.config generated by "dotnet publish", Only used when hosting under IIS -->
<configuration>
<system.webServer>
<aspNetCore stdoutLogEnabled="true">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
Sie können das gewünschte ASPNETCORE_ENVIRONMENT im Argument dotnet publish als Argument übergeben, indem Sie Folgendes verwenden:
/p:EnvironmentName=Staging
z.B. dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
Dadurch wird die Datei web.config mit der für Ihr Projekt angegebenen korrekten Umgebung generiert:
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Um zwei oder mehr Profile einzurichten, müssen Sie ein zusätzliches Profil erstellen, wie in einem verknüpften Artikel erwähnt , und Ihr launchSettings.json
enthält ein Array:
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
Um die Umgebungsvariable lesen zu können, müssen Sie während des Startvorgangs angebenund die zusätzliche Methode AddEnvironmentVariables
aufrufen, damit die Variablen Folgendes ausführen:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
// general properties
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
// specify the environment-based properties
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// do not forget to add environment variables to your config!
.AddEnvironmentVariables();
Configuration = builder.Build();
}
}
Ich hatte die gleiche Anforderung und kam zu folgenden Lösungen. Dies funktioniert gut mit automatisierten Bereitstellungen und erfordert weniger Konfigurationsänderungen.
1. Ändern der Projektdatei (.CsProj) -Datei
MSBuild unterstützt die EnvironmentName
-Eigenschaft, die dabei helfen kann, die richtige Umgebungsvariable für die Umgebung festzulegen, die Sie bereitstellen möchten. Der Umgebungsname würde in der web.config während der Veröffentlichungsphase hinzugefügt.
Öffnen Sie einfach die Projektdatei (* .csProj) und fügen Sie das folgende XML hinzu.
<!-- Custom Property Group added to add the Environment name during publish
The EnvironmentName property is used during the publish for the Environment variable in web.config
-->
<PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
<EnvironmentName>'$(Configuration)'</EnvironmentName>
</PropertyGroup>
Der obige Code würde den Umgebungsnamen als Development
für leere oder Debug
-Konfiguration hinzufügen. Für jede andere Konfiguration wird der Umgebungsname aus der ausgewählten Konfiguration ausgewählt. Dadurch wird die ASPNETCORE_ENVIRONMENT
-Umgebung mit der gewünschten Konfiguration hinzugefügt. Sie können die Logik für den Umgebungsnamen nach Bedarf ändern, indem Sie die CsProj-Datei aktualisieren. Weitere Details hier
2. Hinzufügen der EnvironmentName-Eigenschaft in den Veröffentlichungsprofilen.
Wir können die <EnvironmentName>
-Eigenschaft auch im Veröffentlichungsprofil hinzufügen. Öffnen Sie die Veröffentlichungsprofildatei, die sich unter Properties/PublishProfiles/{profilename.pubxml}
befindet. Dadurch wird der Umgebungsname in web.config festgelegt, wenn das Projekt veröffentlicht wird. Mehr Details hier
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
Wie in der Abbildung oben gezeigt, kann für jede Konfiguration eine Umgebung hinzugefügt werden, und der Name der EnvironmentName
-Eigenschaft kann in jeder * .pubxml-Datei geändert werden.
3. Befehlszeilenoptionen mit dotnet publish
Darüber hinaus können wir die Eigenschaft EnvironmentName
als Befehlszeilenoption an den Befehl dotnet publish
übergeben. Der folgende Befehl würde die Umgebungsvariable als Development
in die Datei web.config aufnehmen.
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
Einfache Einstellung in Visual Studio IDE.
Projekt> Eigenschaften> Debuggen> Umgebungsvariablen
Bitte verwenden Sie keine Umgebungsvariablen auf Maschinenebene stattdessen. Für die Anwendung besteht die Möglichkeit, dass eine andere Anwendung Die Änderung kann sich jedoch auch auf andere Anwendungen auswirken.
Ich denke, Sie können es nicht im Veröffentlichungsprofil tun. Sie müssen eine Umgebungsvariable festlegen, z. ASPNETCORE_ENVIRONMENT = Staging . Ich hatte eine ähnliche Aufgabe mit einer Aspnet-Core-Web-App auf Azure. Ich wollte Entwicklung, Inszenierung und Produktion. So wie ich es gemacht habe, war es genau mit der env-Variable.