.NET Core控制台应用程序,如何为每个环境配置appSettings?

use*_*547 48 c# console-application .net-core

我有一个.NET Core 1.0.0控制台应用程序和两个环境.我需要能够使用appSettings.dev.jsonappSettings.test.json基于我在运行时设置的环境变量.对于ASP.NET Core Web应用程序来说,这似乎非常简单,通过依赖注入和IHostingEnvironment以及EnvironmentName env.变量,但是我应该如何为控制台应用程序连接(除了编写我自己使用的自定义代码Microsoft.Framework.Configuration.EnvironmentVariables)?

谢谢.

Jay*_*aya 66

这是我们在.netcore控制台应用程序中执行此操作的方式.这里的关键是在项目中包含正确的依赖项(可能不是全部,根据您的需要进行检查)并复制以输出appSetting.json作为构建选项的一部分

  {
       "Microsoft.Extensions.Configuration": "1.0.0",
       "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
       "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
       "Microsoft.Extensions.Configuration.Json": "1.0.0",
  } 
    "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
       "include": [
       "appsettings*.json",
       "App*.config"
                 ]
          }
},

  using Microsoft.Extensions.Configuration;
  namespace MyApp
  {
    public static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");


        var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true)
            .AddJsonFile($"appsettings.{environmentName}.json", true, true)
            .AddEnvironmentVariables();
        var configuration = builder.Build();
        var myConnString= configuration.GetConnectionString("SQLConn");
    }
Run Code Online (Sandbox Code Playgroud)

}

  • 谢谢.我最终使用了一个更复杂的版本,使用`new ConfigurationBuilder().AddEnvironmentVariables()`并找到`ASPNETCORE_ENVIRONMENT`. (4认同)
  • 我认为你应该添加一个 nuget `Microsoft.Extensions.Configuration.Json` nuget 包:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.0&tabs=basicconfiguration #json-配置 (2认同)
  • 这个 Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 如何在不参考 Microsoft.AspNetCore.Hosting 的情况下工作? (2认同)
  • 使用新的 csproj 结构,您将 <ItemGroup> <None Update="appsettings*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> (2认同)
  • 请更新您的答案。显然你的代码示例的 json 部分不需要...... (2认同)

Mer*_*ix2 34

从 Net Core 3.1++ 开始,通用 Host 类 Microsoft.Extensions.Hosting.Host 使用 DOTNET_ENVIRONMENT 环境变量而不是 ASPNETCORE_ENVIRONMENT。

项目调试设置中的设置DOTNET_ENVIRONMENT="Development"无需任何额外编码即可工作。

或者您可以添加自己的前缀,如下所示:

// works for WPF but should work similar for Console Apps
public partial class App : Application
{
    private readonly IHost _host;

    public App()
    {
        _host = Host.CreateDefaultBuilder()
            .ConfigureHostConfiguration(configHost => {
                configHost.AddEnvironmentVariables(prefix: "PREFIX_");
            })
            .ConfigureServices((context, services) =>
            {
                ConfigureServices(context.Configuration, services);
            })
            .Build();
    }

    private void ConfigureServices(
        IConfiguration configuration,
        IServiceCollection services)
    {
       // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)


Mov*_*GP0 9

IHostingEnvironment您应该使用两个接口。一种用于ASP.NET Core应用程序,另一种用于.NET Core控制台应用程序。您可以同时使用以下代码示例:

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting.Internal;

namespace MyApplication.Common
{
    public static class ConfigurationFactory
    {
        /// <summary>
        /// Use for ASP.NET Core Web applications.
        /// </summary>
        /// <param name="config"></param>
        /// <param name="env"></param>
        /// <returns></returns>
        public static IConfigurationBuilder Configure(IConfigurationBuilder config, IHostingEnvironment env)
        {
            return Configure(config, env.EnvironmentName);
        }

        /// <summary>
        /// Use for .NET Core Console applications.
        /// </summary>
        /// <param name="config"></param>
        /// <param name="env"></param>
        /// <returns></returns>
        private static IConfigurationBuilder Configure(IConfigurationBuilder config, Microsoft.Extensions.Hosting.IHostingEnvironment env)
        {
            return Configure(config, env.EnvironmentName);
        }

        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();
        }

        /// <summary>
        /// Use for .NET Core Console applications.
        /// </summary>
        /// <returns></returns>
        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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 该答案应该更新,因为它当前使用折旧的代码。您应该删除“using Microsoft.AspNetCore.Hosting;”语句,并明确定义在这种情况下完全键入的新建议接口。“用于 ASP.NET Core Web 应用程序。”:`public static IConfigurationBuilder 配置(IConfigurationBuilder config, Microsoft.AspNetCore.Hosting.IWebHostEnvironment env)` 和“用于 .NET Core 控制台应用程序。”:`private static IConfigurationBuilder 配置(IConfigurationBuilder配置,Microsoft.Extensions.Hosting.IHostEnvironment env)`。 (2认同)

cha*_*ier 9

如果像我一样,您只是想为发布和开发模式使用不同的配置文件,只需添加一个 appsettings.Development.json 文件,并在文件的属性窗口中将 CopyToOutputDirectory 设置设置为 true 即可。

现在,要根据构建配置访问文件,您可以使用 #if DEBUG预处理器指令

这是一个例子:

static void Main(string[] args)
{

#if DEBUG
    var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.Development.json", true, true);
#else
    var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true);
#endif

    var configuration = builder.Build();

    // ... use configuration
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的解决方案,因为它可以隐藏编译错误,一旦您推送到构建服务器并且指令变为 true/false,这些错误就会变得明显。使用环境变量要好得多。我并不是在评判——我过去已经做过很多次了,只是我遇到过几次我提到的问题。 (4认同)
  • 我建议您*总是*添加`appsettings.json`文件(它解决了@jcvandan从不加载它的问题)和`#if DEBUG`*也*加载`appsettings.Development.json` - 标准方式是允许开发人员根据需要覆盖设置,而不必全部指定。 (2认同)

vic*_*710 7

对于使用.NET Core 2.1.0+版和Microsoft.Extensions.Hosting托管控制台应用程序的用户,您可以使用以下代码(根据周飞宇在另一个线程中的回答):

var hostBuilder = new HostBuilder()
    .ConfigureHostConfiguration(config =>
    {
        if (args != null)
        {
            // enviroment from command line
            // e.g.: dotnet run --environment "Staging"
            config.AddCommandLine(args);
        }
    })
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true);
    })
Run Code Online (Sandbox Code Playgroud)