Как переменные окружения и файлы appSettings используются во время публикации? - PullRequest
0 голосов
/ 05 марта 2019

Если у меня есть два файла настроекappSettings.json и appSettings.Development.json

Когда я использую публикацию из Visual Studio, оба должны быть скопированы в целевую папку?Я не уверен, потому что они оба появляются в целевой папке (на сервере разработки), когда я публикую.У меня сложилось впечатление, что они объединились во время сборки и был опубликован ONLY файл appSettings.json.Если нет, то нужно ли вручную рассматривать кодирование этих различий, как я видел в нескольких примерах?

напр.Этот пример загружает настройки через код (НЕ как я это делаю)Примечание - они используют имя среды, параметр ASPNETCORE_ENVIRONMENT

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables();

    Configuration = builder.Build();
}

Часть моего класса Startup показана ниже.Примечание. Я не ссылаюсь на параметр среды.

 public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);


            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
    }

  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });

        app.UseSpa(spa =>
        {
            // To learn more about options for serving an Angular SPA from ASP.NET Core,
            // see https://go.microsoft.com/fwlink/?linkid=864501

            spa.Options.SourcePath = "ClientApp";

            if (env.IsDevelopment())
            {
                spa.UseAngularCliServer(npmScript: "start");
            }
        });
    }

[ Обновление ]Я нашел свой ответ здесь - ключ, который мне не хватало, это обновление файла csproj для параметров публикации, относящихся к среде.https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#configuration-with-webconfig Итак, я предполагаю, что если у меня будет несколько разных сред, каждая со своим собственным файлом настроек, то публикация приведет к тому, что ВСЕ из них будут отправлены в целевой каталог?

1 Ответ

0 голосов
/ 05 марта 2019

Это немного сбивает с толку с ASP.NET Core, особенно если вы начинаете работать с ASP.NET ранее.Конфигурации сборки (Debug, Release) действительно не имеют никакого отношения к тому, что происходит с ASP.NET Core.Приложение ASP.NET Core технически не зависит от среды.В то время как в более старом приложении ASP.NET вам пришлось бы публиковать для конкретной среды, теоретически вы можете взять ту же публикацию ASP.NET Core и запустить ее в любой из ваших сред.Это, конечно, объясняется тем фактом, что Web.config не используется ASP.NET Core.

Это и есть причина, по которой все специфичные для среды файлы JSON отправляются в путь.То, что в конечном итоге используется, основано на значении переменной среды ASPNETCORE_ENVIRONMENT, установленной во время выполнения, а не на той конфигурации сборки, которую вы выбрали при публикации.Что на самом деле очень приятно, когда вы думаете об этом.Вы можете взять то же опубликованное приложение, запустить его в своей «промежуточной» среде, чтобы убедиться, что все работает, а затем развернуть его в своей «рабочей» среде, просто убедившись, что для каждой среды задано соответствующее значение для ASPNETCORE_ENVIRONMENT.Это делает конвейеры выпуска тривиальными.

Тем не менее, все еще возможно использовать такие вещи, как директивы компилятора #if DEBUG, и если вы сделаете , то , тогда в вашем ASP.NET будут различия.Основное приложение в зависимости от выбранной конфигурации сборки, но вам действительно следует избегать этого в первую очередь.В общем, вам следует полагаться только на абстракцию IHostingEnvironment в приложении ASP.NET Core для определения того, что происходит в какой среде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...