发布的控制台应用程序上没有.NET Core 2.0的appsettings。

3
我正在为我们团队的第一个.NET Core应用程序制定自动化构建流程。我们的流程是在构建服务器上生成一个工件包(包含所有不同类型的应用程序、数据库迁移脚本等),然后在单独的步骤中将该包部署到我们拥有的各种环境(开发、测试、演示、培训、生产等)。
在完整的.NET Framework应用程序中,我们使用Slow Cheetah对诸如Windows服务和控制台应用程序之类的内容进行配置转换,以便在安装应用程序时它具有正确的配置。
现在,针对.NET Core 2.0应用程序,我看到了两个问题:
1. 发布操作(据我所见,这是获取单个应用程序某种工件包的首选方式)不包含任何appsettings文件(除了ASP.NET Core应用程序)。
2. 如果我手动复制appsettings,那么部署版本如何知道使用哪个appsettings.json?
事实上,我宁愿不部署除目标环境的确切设置以外的任何内容。我认为部署所有环境的设置(或任何不同于目标环境的配置集)都是一场事故等待发生。(编辑:强调我不想在运行时合并不同来源的配置,因为如果出现问题,尝试确定实际应用哪个配置元素将会很混乱。)那么,我应该如何“合并”特定于环境的项与主要的appsettings.json文件?

1
appsettings.json 只是一个没有特殊意义的文件。如果您想在发布时包含它,您必须将其作为内容包含或复制到输出目录中。.NET Core 的配置可以从多个提供程序读取配置数据,而无需任何默认值或特殊处理。 - Panagiotis Kanavos
请参考以下资料:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/environments 和 https://blogs.msdn.microsoft.com/cjaliaga/2016/08/10/working-with-azure-app-services-application-settings-and-connection-strings-in-asp-net-core/ - Peter B
很遗憾,@PeterB,这两个文档都是关于ASP.NET Core的,而不是控制台应用程序或Windows服务,因此并不适用。(顺便说一句,它们也无法帮助部署到低于10版本的IIS或Azure之外 - 但这是我正在尝试解决的另一个问题。) - Colin Mackay
1个回答

4
为了使发布操作包括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可以在部署过程中为您修改appsettings.json(JSON配置变量功能)。这实际上是我们团队使用的方法。此外,您还可以编写一些自定义脚本,在CI上合并配置。

@ColinMackay 你是如何部署你的应用程序的?你使用CI还是Docker?如果你使用Docker,你可以将配置作为环境变量提供给容器。如果它是Windows服务,你可以将命令行参数传递给服务配置。在这两种情况下,你都可以使appsettings.json可选。并且在每种情况下,你只有一个配置源。 - Andrii Litvinov
我们有一个Cake脚本从我们的构建服务器部署。我们不使用Docker(虽然在公司环境中,“很快”可能会成为一个选项)。 - Colin Mackay
@ColinMackay 在构建过程中,使用Cake可以将值合并到输出文件夹中的appsettings.json中,因为它是纯C#,这应该是可行的。 - Andrii Litvinov
1
是的 - 我在想如果我导入JSON.NET,我就可以这样做。 - Colin Mackay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接