【问题标题】:No .NET Core 2.0 appsettings on a published console app已发布的控制台应用程序上没有 .NET Core 2.0 应用程序设置
【发布时间】:2018-01-12 12:02:52
【问题描述】:

我正在为我们团队的第一个 .NET Core 应用程序生成自动构建过程。我们的过程是在我们的构建服务器上生成一个工件包(包含所有不同类型的应用程序、数据库迁移脚本等),然后在一个单独的步骤中将该包部署到我们拥有的各种环境(开发、测试、演示、培训、直播等)

在完整的 .NET Framework 应用程序中,我们使用 Slow Cheetah 对 Windows 服务和控制台应用程序等执行配置转换,以便当应用程序安装在目标系统上时,它具有正确的配置。

现在使用 .NET Core 2.0 应用程序,我发现了两个问题:

  1. 发布操作(据我所知,这是为单个应用获取某种人工制品包的首选方式)不包含任何 appsettings 文件(ASP.NET Core 应用除外)。

  2. 如果我自己编写了 appsettings 副本的脚本,部署的版本如何知道要使用哪个 appsettings..json?

事实上,除了该环境的确切设置外,我宁愿不部署任何东西。在我看来,为所有环境部署设置(或为目标环境设置的确切配置之外的任何设置)都是等待发生的意外。 (编辑:要强调的是,我宁愿不在运行时合并不同的配置源,因为如果事情不能正常工作,试图弄清楚实际应用了哪个配置元素,那将是一团糟。) 那么,我如何将环境特定项与主 appsettings.json 文件“合并”?

【问题讨论】:

  • appsettings.json 只是一个没有特殊意义的文件。如果要在发布时包含它,则必须将其作为内容包含或复制到输出中。 .NET Core 的配置可以从多个提供程序读取配置数据,无需任何默认值或特殊处理。
  • @PeterB 不幸的是,这两个文档都引用了 ASP.NET 核心,而不是控制台应用程序或 Windows 服务,因此并不真正适用。 (顺便说一句,他们也无法帮助部署到 10 之前或 Azure 之外的 IIS 版本 - 但这是我试图解决的另一大难题。)

标签: c# .net .net-core console-application


【解决方案1】:

要使发布操作包含 appsettings.json 文件以输出,您需要在 .csproj 文件中添加以下内容:

<ItemGroup>
  <None Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

出于安全原因,建议您不要在存储库中使用生产设置。

更好的选择是为部署它的应用程序提供生产配置。例如,如果将其部署为 Windows 服务,则可以通过环境变量或命令行参数来完成。

代码如下:

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .AddEnvironmentVariables()
    .AddCommandLine(args)
    .Build();

那么,我如何将环境特定项与主 appsettings.json 文件“合并”?

Octopus Deploy 可以在部署过程https://octopus.com/docs/deploying-applications/deploying-asp.net-core-web-applications/json-configuration-variables-feature 中为您修改 appsettings.json。这就是我们最终加入我团队的方式。

您还可以编写一些自定义脚本来合并 CI 上的配置。

【讨论】:

  • @ColinMackay 你如何部署你的应用程序?你用 CI 吗?还是码头工人?如果您使用 Docker,您可以将配置作为环境变量提供给容器。如果是 Windows 服务,您可以将命令行参数传递给服务配置。在这两种情况下,您都可以将 appsettings.json 设为可选。在每种情况下,您将只有一个配置源。
  • 我们从构建服务器部署了一个 Cake 脚本。我们不使用 Docker(尽管我们应该能够在不久的某个时候将其作为一个选项 - 无论“很快”在公司环境中意味着什么)。
  • @ColinMackay 在构建过程中应该可以将输出文件夹中的 appsettings.json 值与 Cake 合并,因为它是纯 C#。
  • 是的 - 我在想,如果我导入 JSON.NET,我就能做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2016-12-07
  • 1970-01-01
相关资源
最近更新 更多