J'ai une application principale ASP.NET (Web Api). La documentation a expliqué fonctionne avec plusieurs environnements , mais n'a pas expliqué comment définir aspnetcore_environment
lors de la publication du site Web.
Disons donc que si j'ai 3 environnements Development
, Staging
et Production
Dans l'application Web ASP.NET classique, j'avais l'habitude de créer 3 configurations de construction. Development
, Staging
et Production
(comme dans l'image ci-dessous). puis 3 fichiers .pubxml
, un pour chaque configuration. Dois-je utiliser la même approche pour l'application ASP.NET Core
également?
Comment définir aspnetcore_environment
dans le fichier .pubxml
?
Si l'approche spécifiée à la question 1 est obsolète, quelle est l'approche alternative? (J'utilise Jenkins pour CI)
Mise à jour 1
Je comprends que je dois définir ASPNETCORE_ENVIRONMENT
mais je ne suis pas en mesure de comprendre où nous plaçons cela. Pendant le développement, je peux définir cela dans le profil dans launchSettings.json
. Cependant, la question était de savoir comment définir cela lors de la publication en mode de stockage intermédiaire ou en production. définissons-nous la variable d'environnement sur le serveur cible lui-même?
Mise à jour 2
J'ai trouvé un article ici qui explique différentes manières de définir une variable d'environnement. Cela répondait partiellement à ma question. Cependant, lorsque je publie l'application, le processus de publication n'honore pas la variable d'environnement lors de la publication appsettings.{env.EnvironmentName}.json
J'ai créé séparément post pour cette question
Lorsque vous hébergez l'application sous IIS, vous pouvez définir la variable d'environnement dans web.config.
https://docs.Microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Pour le générer lors de la publication, ajoutez un fichier web.config à la racine de votre projet. "Dotnet publish" utilisera ce fichier comme base pour celui généré dans le dossier de publication. Ensuite, vous pouvez modifier la valeur de votre système de déploiement.
<?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>
Vous pouvez transmettre l'ASPNETCORE_ENVIRONMENT souhaité à la commande de publication dotnet en tant qu'argument à l'aide de:
/p:EnvironmentName=Staging
par exemple. dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
Cela générera le fichier web.config avec l’environnement correct spécifié pour votre projet:
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Pour configurer deux profils ou plus, vous devez créer un profil supplémentaire, sous la forme mentionné dans un article lié , et votre launchSettings.json
contiendra un tableau:
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express (Staging)": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
}
}
}
Pour pouvoir lire la variable d'environnement, vous devez le spécifier au démarrage } _ et appeler la méthode supplémentaire AddEnvironmentVariables
aux variables:
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();
}
}
J'avais les mêmes exigences et j'ai proposé les solutions suivantes. Cela fonctionne bien avec les déploiements automatisés et nécessite moins de changements de configuration.
1. Modification du fichier de projet (.CsProj) fichier
MSBuild prend en charge la propriété EnvironmentName
qui peut vous aider à définir la bonne variable d'environnement en fonction de l'environnement que vous souhaitez déployer. Le nom de l'environnement serait ajouté dans le fichier web.config lors de la phase de publication.
Ouvrez simplement le fichier de projet (* .csProj) et ajoutez le code XML suivant.
<!-- 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>
Le code ci-dessus ajouterait le nom de l’environnement sous la forme Development
pour une configuration vide ou Debug
. Pour toute autre configuration, le nom de l'environnement serait choisi dans la configuration sélectionnée. Cela ajoutera l'environnement ASPNETCORE_ENVIRONMENT
avec la configuration souhaitée. Vous pouvez modifier la logique du nom de l'environnement à votre guise en mettant à jour le fichier CsProj. Plus de détails ici
2. Ajout de la propriété EnvironmentName dans les profils de publication.
Nous pouvons également ajouter la propriété <EnvironmentName>
dans le profil de publication. Ouvrez le fichier de profil de publication situé au Properties/PublishProfiles/{profilename.pubxml}
. Le nom de l’environnement sera défini dans web.config lors de la publication du projet. Plus de détails ici
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
Comme indiqué dans l'image ci-dessus, l'environnement peut être ajouté pour chaque configuration et le nom de la propriété EnvironmentName
peut être modifié dans chaque fichier * .pubxml.
3. Options de ligne de commande utilisant dotnet publish
De plus, nous pouvons transmettre la propriété EnvironmentName
en tant qu’option de ligne de commande à la commande dotnet publish
. La commande suivante inclurait la variable d’environnement Development
dans le fichier web.config.
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
Un moyen simple de le configurer dans Visual Studio IDE.
Projet> Propriétés> Débogage> Variables d'environnement
N'utilisez pas de variables d'environnement de niveau machine à la place de scope à l'application, il est possible qu'une autre application fasse De même, le changement peut affecter d'autres applications.
Je pense que vous ne pouvez pas le faire dans le profil de publication. Vous devez définir une variable d'environnement, par exemple ASPNETCORE_ENVIRONMENT = Staging . Je devais faire la même chose avec une application Web principale Aspnet sur Azure. Je voulais avoir le développement, la mise en scène et la production. La façon dont je l'ai fait était exactement avec la variable env.