发布期间如何使用环境变量和appSettings文件?

时间:2019-03-05 19:18:48

标签: visual-studio asp.net-core

如果我有两个设置文件
appSettings.json和appSettings.Development.json

当我使用从Visual Studio中发布时,是否都应该将两者都复制到目标文件夹?我不确定,因为它们在我发布时都显示在目标文件夹中(在开发服务器上)。我的印象是,它们在构建时结合在一起,并且发布了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 :(得分:0)

与ASP.NET Core有点混淆,尤其是如果您以前使用过ASP.NET的话。生成配置(调试,发行版)实际上与ASP.NET Core发生的一切无关。 ASP.NET Core应用程序在技术上与环境无关。对于较旧的ASP.NET应用程序,您必须针对特定环境进行发布,而从理论上讲,您可以将相同的ASP.NET Core发布并在任何环境中运行。当然,这是因为ASP.NET Core没有利用Web.config。

因此,这就是为什么所有特定于环境的JSON文件都会随之而来的原因。最终使用的是基于运行时设置的ASPNETCORE_ENVIRONMENT环境变量的值,而不是发布时选择的构建配置。考虑一下,这实际上真的很棒。您可以使用同一发布的应用程序,在“暂存”环境中运行该应用程序以确保一切正常,然后仅通过确保每个环境都具有适用于ASPNETCORE_ENVIRONMENT设置的值来将其部署到您的“生产”环境中。这使得发布管道变得微不足道。

也就是说,仍然可以使用#if DEBUG编译器指令之类的东西,如果执行 ,则ASP.NET Core应用程序中的内容会有所不同,具体取决于构建选择的配置,但您实际上应该首先避免这样做。通常,您应该仅依靠ASP.NET Core应用程序中的IHostingEnvironment抽象来确定在什么环境中会发生什么。