Как установить aspnetcore_environment в файл публикации?

У меня есть приложение ASP.NET Core (Web Api). В документации объясняется работа с несколькими средами, однако не удалось объяснить, как установить aspnetcore_environment при публикации веб-сайта.

Итак, скажем, если у меня есть 3 среды Development, Staging и Production

  • В классическом веб-приложении ASP.NET я использовал для создания 3-х строчных конфигураций. Development, Staging и Production (как показано на рисунке ниже). а затем 3 .pubxml файлов, по одному для каждой конфигурации. Нужно ли использовать тот же подход для приложения ASP.NET Core?

  • Как установить aspnetcore_environment в .pubxml файл?

  • Если подход, указанный в Вопросе 1, устарел, то какой альтернативный подход? (Я использую Jenkins для CI)

введите описание изображения здесь

Обновление 1

Я понимаю, что мне нужно установить aspnetcore_environment, но я не могу понять, где мы это устанавливаем? Во время разработки я могу установить это в профиле в launchSettings.json, однако вопрос был в том, как мы устанавливаем это при публикации в стадии постановки или производства? устанавливаем ли переменную окружения на самом целевом сервере?

введите описание изображения здесь

Обновление 2
Здесь я нашел статью которая объясняет различные способы настройки переменной окружения. Это частично ответило на мой вопрос. Однако при публикации приложения процесс публикации не соблюдает переменную среды при публикации appsettings.{env.EnvironmentName}.json
Я создал отдельный
пост для этого вопроса

Ответ 1

При размещении приложения под IIS вы можете установить переменную окружения в web.config.

https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module

Чтобы сгенерировать его при публикации, добавьте файл web.config в корневой каталог вашего проекта, "dotnet publish" будет использовать этот файл в качестве основы для файла, сгенерированного в папке публикации. Затем вы можете изменить значение в вашей системе развертывания.

<?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>

Ответ 2

Вы можете передать требуемый ASPNETCORE_ENVIRONMENT в команду публикации dotnet в качестве аргумента, используя:

/p:EnvironmentName=Staging

например, dotnet publish/p:Configuration=Release/p:EnvironmentName=Staging

Это сгенерирует файл web.config с правильной средой, указанной для вашего проекта:

    <environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
    </environmentVariables>

Ответ 3

Чтобы настроить два или более профилей, вам нужно создать дополнительный профиль, так как упомянутый в связанной статье, и ваш launchSettings.json будет содержат массив:

"profiles": {
  "IIS Express": {
    "commandName": "IISExpress",
    "launchBrowser": true,
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
    }
  },
  "IIS Express (Staging)": {
    "commandName": "IISExpress",
    "launchBrowser": true,
    "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Staging"
    }
  }
}

Чтобы иметь возможность читать переменную окружения, вам нужно указать ее во время запуска и вызвать дополнительный метод AddEnvironmentVariables для переменных принимают действие:

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();
    }
}

Ответ 4

Я думаю, вы не можете сделать это в профиле публикации. Вы должны установить переменную среды, например. ASPNETCORE_ENVIRONMENT = Стадия. Я должен был сделать аналогичную вещь с основным веб-приложением aspnet на Azure. Я хотел иметь dev, постановку и производство. То, как я это делал, было точно с переменной env.

Ответ 5

Простой способ установить его в visual studio IDE.

Проект > Свойствa > Отладкa > Переменные среды

введите описание изображения здесь

Пожалуйста, не используйте переменные среды машинного уровня вместо области к приложению, есть возможность другого применения то же изменение может повлиять на другое приложение.

Ответ 6

У меня было такое же требование, и я придумал следующие решения. Это хорошо работает с автоматизированными развертываниями и требует меньше изменений конфигурации.

1. Изменение файла проекта (.CsProj)

MSBuild поддерживает свойство EnvironmentName которое может помочь установить правильную переменную среды в соответствии с той средой, которую вы хотите развернуть. Имя среды будет добавлено в файл web.config на этапе публикации.

Просто откройте файл проекта (*.csProj) и добавьте следующий XML.

    <!-- 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>

Приведенный выше код добавит имя среды как Development для пустой или Debug конфигурации. Для любой другой конфигурации имя среды будет выбрано из выбранной конфигурации. Это добавит среду ASPNETCORE_ENVIRONMENT с желаемой конфигурацией. При желании вы можете изменить логику для имени среды, обновив файл CsProj. Подробнее здесь

2. Добавление свойства EnvironmentName в профили публикации.

Мы также можем добавить свойство <EnvironmentName> в профиль публикации. Откройте файл профиля публикации, который находится по адресу Properties/PublishProfiles/{profilename.pubxml} Это позволит установить имя среды в web.config при публикации проекта. Подробнее здесь

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

enter image description here

Как показано на рисунке выше, среда может быть добавлена для каждой конфигурации, а имя свойства EnvironmentName можно изменить в каждом файле *.pubxml.

3. Параметры командной строки с использованием dotnet publish

Кроме того, мы можем передать свойство EnvironmentName в качестве параметра командной строки dotnet publish. Следующая команда включит переменную окружения как Development в файл web.config.

dotnet publish -c Debug -r win-x64/p:EnvironmentName=Development