Будет ли публиковать профиль работы для настройки EnvironmentName, если не публикации в IIS? - PullRequest
0 голосов
/ 25 октября 2019

Я использую этот же метод для установки имени eonvironment для веб-приложения, которое я публикую в папке. Однако при публикации приложения консоли ядра .net, использующего IWebhostBuilder, имя среды не обновляется?

У меня есть приложение консоли ядра .net, которое я публикую в папку, и приложение консоли используетIWebhostBuilder, поэтому мне нужно иметь возможность установить имя среды перед публикацией. Кажется, он хочет получить настройки по умолчанию для приложений, а не для моей целевой среды (Dev). У меня есть файл appsettings.Dev.json

enter image description here

Мой профиль публикации выглядит следующим образом

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <PublishProtocol>FileSystem</PublishProtocol>
    <Configuration>Dev</Configuration>
    <Platform>Any CPU</Platform>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <PublishDir>\\dev-server1\d$\Services\BoxService</PublishDir>
    <SelfContained>false</SelfContained>
    <_IsPortable>true</_IsPortable>
    <EnvironmentName>Dev</EnvironmentName>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  </PropertyGroup>
</Project>

[Редактировать] Ничего не получалось, поэтому я провел эксперимент, потому что, очевидно, я что-то упускаю или просто не понимаю. Я создал новое тестовое консольное приложение, в котором ничего не было, кроме одного класса с методом Main. Добавил необходимые пакеты (Extensions.Configuration и т. Д.), Затем приступил к публикации приложения в локальной папке со следующим в моем publishprofile.

<EnvironmentName>Local</EnvironmentName>

Это явно не используется, потому что, когда я запускаю его изVisual Studio сообщает, что была задана правильная среда, но при запуске из опубликованной папки она выглядит так, как будто среда не была установлена.

Here is Program.cs 
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.EnvironmentVariables;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Cmd1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");


            var environmentName =
                Environment.GetEnvironmentVariable("ENVIRONMENT");

            // create service collection
            var services = new ServiceCollection();


            // build config
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", false)
                .AddJsonFile($"appsettings.{environmentName}.json", true)
                .AddEnvironmentVariables()
                .Build();

            // setup config
            services.AddOptions();
            services.Configure<AppSettings>(configuration.GetSection("App"));

            // create service provider
            var serviceProvider = services.BuildServiceProvider();

            var appSettings = serviceProvider.GetService<IOptions<AppSettings>>();

            string env = Environment.GetEnvironmentVariable("Environment");

            Console.WriteLine($" We are looking at {appSettings.Value.TempDirectory} from environment: {env}");
        }
    }
}

Appsettings.json

{
  "App": {
    "TempDirectory": "d:\temp"
  }
}

Appsettings.Local.json

{
  "App": {
    "TempDirectory": "c:\\temp\\rss-hero\\tmp\\"
  }
}

Настройка среды в VS enter image description here

Результаты VS

enter image description here

Результаты при запуске из опубликованной папки enter image description here

1 Ответ

0 голосов
/ 25 октября 2019

Вам необходимо настроить IWebhostBuilder следующим образом

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureAppConfiguration(builder =>
    {
        builder.AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.Dev.json", optional: true) // add more if you have
            .AddEnvironmentVariables();
    });

Затем, в зависимости от среды, будет использоваться appsettings{envrionment}.json. Если нет другого подарка, он будет использовать appsettings.json (по умолчанию). После публикации вы можете проверить web.config, чтобы проверить имя используемой среды.

РЕДАКТИРОВАТЬ

Для консольного приложения вы делаете что-то вроде этого

private static IConfigurationBuilder Configure(IConfigurationBuilder config, string environmentName)
    {
        return config
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();
    }

И использовать вот так (базовый хост .Net core)

Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(builder =>
{
    Configure(builder, "Dev");
})
.UseConsoleLifetime()

Или, если вы хотите получить среду из системных переменных среды.

public static IConfiguration CreateConfiguration()
    {
        var env = new HostingEnvironment
        {
            EnvironmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"),
            ApplicationName = AppDomain.CurrentDomain.FriendlyName,
            ContentRootPath = AppDomain.CurrentDomain.BaseDirectory,
            ContentRootFileProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory)
        };

        var config = new ConfigurationBuilder();
        var configured = Configure(config, env);
        return configured.Build();
    }
...