Ядро Dotnet — переменная среды для каждого приложения (процесса) на одном сервере

Мы используем следующий код:

if(env.IsDevelopment()) 
{
    app.UseDeveloperExceptionPage();
}

Это прекрасно работает при локальной разработке и в продакшене, но у нас есть проблема в нашей среде CI/QA, они расположены на одном сервере.

Мы хотели бы иметь возможность указать что-то подобное, но как нам установить переменную среды для каждого приложения? Если бы CI и QA находились на разных серверах, это было бы легко решить.

if(env.IsEnvironment("CI")) 
{
    app.UseDeveloperExceptionPage();
}

Мы также хотели бы иметь определенный appsettings.json для каждой среды, такой как appsettings.ci.json и appsettings.qa.json, и я знаю, что это работает из коробки с переменными среды.

Я уверен, что это должен быть способ указать переменные среды для каждого приложения (процесса), я просто не знаю, как это сделать? :)

Мы используем IIS для размещения нашего приложения.


person JOSEFtw    schedule 06.10.2016    source источник
comment
Переменные среды для каждого процесса, что, я полагаю, в любом случае вам нужно (CI и QA - одно и то же приложение, но разные процессы). Однако ваша проблема заключается в том, что оба процесса имеют один и тот же родительский процесс (IIS) и, следовательно, наследуют одни и те же переменные среды.   -  person MSalters    schedule 06.10.2016


Ответы (2)


Мне помог @davidfowl в слабом канале dotnet core.

Решение состоит в том, чтобы добавить следующее в раздел aspNetCore вашего файла web.config.

<environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="QA" />
    <environmentVariable name="AnotherVariable" value="My Value" />
</environmentVariables>

Итак, мой web.config выглядит так:

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
    <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="QA" />
        <environmentVariable name="AnotherVariable" value="My Value" />
    </environmentVariables>
</aspNetCore>
person JOSEFtw    schedule 06.10.2016

Вы можете переопределить значение в env.EnvironmentName, поскольку оно имеет общедоступный сеттер, и вы можете использовать только определенную группу переменных среды для каждого приложения. Допустим, есть 2 переменные, такие как APP1_OWNENVIRONMENT = "QA", APP2_OWNENVIRONMENT = "CI" для app1 и app2 соответственно.

  1. Когда вы добавляете поддержку переменных среды, вызывая метод .AddEnvironmentVariables(), можно указать фильтр для игнорирования всех переменных без специального префикса. Например

        // APP1_ is the prefix that environment variable names must start with.
        var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .AddEnvironmentVariables(prefix: "APP1_")
            .Build();
    
        env.EnvironmentName = config.GetValue<string>("OWNENVIRONMENT")};
    
        // here env.EnvironmentName has "QA" value so the appsettings.qa.json will be used 
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
    
  2. Такие методы, как IsDevelopment(), IsStaging(), являются просто расширением. методы для IHostingEnvironment, являющиеся оболочкой общего метода IsEnvironment:

    public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
    {
       if (hostingEnvironment == null)
       {
           throw new ArgumentNullException(nameof(hostingEnvironment));
       }
    
       return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
    }
    

Таким образом, вы можете создать свой метод расширения IsQA() по аналогии или вызвать напрямую env.IsEnvironment("QA").

person Set    schedule 06.10.2016
comment
Спасибо за ваш ответ, мне удалось решить эту проблему с помощью web.config с небольшой помощью @davidfowl. Смотрите мой ответ. - person JOSEFtw; 06.10.2016