як встановити ASPNETCORE_ENVIRONMENT для розгляду для публікації основного додатка asp.net?


105

Коли я публікую свою основну веб-програму asp.net у моїй локальній файловій системі, вона завжди приймає виробничу конфігурацію та змінну ASPNETCORE_ENVIRONMENT зі значенням = "Виробництво".

як і де мені потрібно встановити значення змінної ASPNETCORE_ENVIRONMENT, щоб вона враховувалась не лише для налагодження, а й для публікації ? я вже спробував наступні варіанти без успіху:

  • у налаштуваннях Windows
  • у .pubxml файлі
  • у launchSettings.json
  • у проекті.json

3
Чи читаєте ви офіційні документи docs.microsoft.com/en-us/aspnet/core/fundamentals/environments або цей підручник andrewlock.net/… ?
J. Doe


1
stackoverflow.com/questions/43493259/... це має 2 варіанти перевірки справжньої помилки.
Куркула 07

Відповіді:


85

Окрім вищезазначених варіантів, є ще кілька рішень.

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>Production</EnvironmentName>
  </PropertyGroup>

У Developmentнаведеному вище коді буде додано ім'я середовища, як для конфігурації налагодження, або якщо конфігурація не вказана. Для будь-якої іншої конфігурації ім'я середовища буде Productionв створеному файлі web.config. Детальніше тут

2. Додавання властивості EnvironmentName до профілів публікації.

Ми також можемо додати <EnvironmentName>властивість у профілі публікації. Відкрийте файл профілю публікації, який знаходиться за адресою Properties/PublishProfiles/{profilename.pubxml}Це встановить ім'я середовища в web.config під час публікації проекту. Детальніше тут

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

3. Параметри командного рядка за допомогою dotnet публікації

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

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


7
Це здається найкращою відповіддю, наскільки я можу судити. Можливість встановити його для кожного профілю публікації справді мені дуже допомогла.
Джонатан Квінт

У мене працює третій варіант. Чи знаєте ви, чи параметр / p: EnvironmentName згадується де-небудь у документації dotnet?
rasyadi

8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentсаме те, що я шукав. Дякую!
Matt M

Не могли б ви сказати, якою є повна версія "dotnet публікація ....", якщо хтось хотів опублікувати в UAT, QA чи Production?
crazyTech

74

Варіант 1:

Щоб встановити змінну середовища ASPNETCORE_ENVIRONMENT у Windows,

Командний рядок - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Для інших ОС зверніться за цим посиланням - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Варіант 2:

Якщо ви хочете встановити ASPNETCORE_ENVIRONMENT за допомогою, web.configдодайте наступне aspNetCore-

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

42
І те, і інше - жахливі варіанти. 1) встановлює це для всієї ОС, я б хотів, щоб це було на веб-сайті в IIS. 2) AspNet Core не підтримує перетворення web.config. Як ви пропонуєте змінити web.config для розгортання?
Кугель

Офіційну документацію див. Тут - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket

5
Як тільки ви натрапили на кращий варіант ... будь ласка, поділіться тут :)
Санкет,

5
такий тип конфігурації здається дуже брудним.
koo9

2
Ви можете замінити це в профілях публікації для різних середовищ.
cederlof

31

Простий спосіб встановити його в візуальній студії IDE.

Проект> Властивості> Налагодження> Змінні середовища

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


3
Але тоді вам потрібно пам’ятати про зміну цього кожного разу, коли вам потрібно публікувати в іншому середовищі.
Alisson

15
Це не правильно. Це працює лише під час запуску IDE. Зберігає його у файлі launchsettings.json, який є предметом Visual Studio. Не буде працювати для розгортань.
onefootswill

21

Ви повинні слідувати інструкціям, наданим у документації , використовуючи web.config.

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

Зверніть увагу, що ви також можете встановити інші змінні середовища.

Основний модуль ASP.NET дозволяє вказати змінні середовища для процесу, зазначеного в атрибуті processPath, вказавши їх в одному або декількох дочірніх елементах environmentVariable елемента колекції environmentVariables під елементом aspNetCore. Змінні середовища, встановлені в цьому розділі, мають перевагу над системними змінними середовища для процесу.


як встановити його в консольній програмі .net?
user441365

Налаштуйте їх за допомогою діалогового вікна Змінні середовища Windows.
Девід Пайн

1
Але чи є спосіб встановити це в проекті, а не в ОС?
user441365

Не для консольних програм у .NET Core, про які я знаю ... ні - можливо, це - stackoverflow.com/a/46445432/2410379 ?
Девід Пайн

15

Ось як ми можемо встановити під час виконання:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

Не впевнений, чому за це було проголосовано, бо це єдине, що мені вдалося.
pcalkins

1
Швидше за все, він був відхилений через жорстко закодовані значення в коді.
Кевін К.

Найшвидше тестування, але я погоджуюсь не з тим, що я хотів би бачити як зареєстрований код, довгостроковий.
Бретт Рігбі,

хоча це жорстко закодовано, я вважаю це найпростішим способом зробити це.
Зник

1
Я віддаю перевагу методу, я використовую його в поєднанні з DEBUG для встановлення правильного значення.
Дейв де Йонг

6

З останньою версією dotnet cli (2.1.400 або новішої) ви можете просто встановити цю властивість msbuild $(EnvironmentName)і інструмент публікації подбає про додавання ASPNETCORE_ENVIRONMENT до web.config з іменем середовища.

Також підтримка XDT доступна починаючи з 2.2.100-preview1.

Зразок: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md


7
Не могли б Ви детальніше you can just set this msbuild property $(EnvironmentName) and publishабо надати посилання?
DanElliott

1
як встановити його в консольній програмі .net?
user441365

5
  1. Створіть налаштування додатків. *. Json файли. (Приклади: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Додайте свої змінні до цих файлів.

  3. Створіть окремий профіль публікації для кожного середовища, як зазвичай.

  4. Відкрийте PublishProfiles / Development.pubxml (іменування буде базуватися на тому, що ви назвали Профіль публікації).

  5. Просто додайте тег до PublishProfile, щоб встановити змінну EnvironmentName , appsettings. *. Json дозвіл на імена файлів робить все інше.

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

Довідково: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

Зверніться до розділу “Встановлення середовища”.


3

Цю змінну можна зберегти в json. Наприклад envsettings.json із вмістом, як показано нижче

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Пізніше змініть свій program.cs, як показано нижче

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

Таким чином він завжди буде включений до публікації, і ви можете змінити необхідне значення відповідно до середовища, де розміщується веб-сайт. Цей метод також можна використовувати в консольному додатку, оскільки зміни внесені до Program.cs


0

Я виявив, що це працює для мене, встановивши цю змінну безпосередньо на Azure platorm (якщо ви її використовуєте). Просто виберіть веб-програму -> конфігурація -> налаштування програми та додайте змінну та її значення, а потім натисніть кнопку Зберегти.


0

Інший варіант, який ми використовуємо в наших проектах, щоб мати можливість встановити середовище для кожного сайту, - це додати до проекту файл Parameters.xml із таким вмістом:

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

Дія збірки для цього файлу - Вміст, а Дія копіювання - Копіювати, якщо новіша, тож вона буде частиною пакету для розгортання.

Потім, для розгортання пакету та встановлення середовища, у Релізі під завданням «WinRM - Розгортання веб-додатків IIS» (воно працює так само добре при використанні завдання «Розгортання веб-програми IIS») ми встановлюємо додаткові аргументи для msdeploy :

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

Таким чином, ми можемо мати кілька випусків, усі з використанням одного і того ж артефакту, але розгорнутого як різні середовища.


0

Я знаю, що це стара публікація, однак думав, що я вкладу своє просте рішення в суміш, оскільки ніхто цього не пропонував.

Я використовую поточний каталог для визначення поточного середовища, а потім перевертаю рядок з'єднання та змінну середовища. Це чудово працює, якщо у вас є дозвіл імен для папок веб-сайту, таких як test / beta / sandbox.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.