Как установить 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