【问题标题】:Deploy different connection string for each environment为每个环境部署不同的连接字符串
【发布时间】:2017-12-01 11:22:52
【问题描述】:

我正在尝试从 mac 在 IIS 上部署一个 asp.net core 2.0 api 项目。

我想做的是为我的开发、暂存和生产环境设置不同的 appsettings.json 文件,然后使用 dotnet -build 作为我的部署脚本的一部分调用不同的环境。

我查看了https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments,它适用于旧版本的 .net 核心,但我无法理解我需要做什么。我不想为操作系统设置环境,而是以编程方式设置它(因为我的登台和生产环境适用于同一台服务器)

我有一个 appsettings.Development.json 文件,当我运行我的应用程序时会使用它,但是当我只是将环境变量设置为构建命令的一部分时,我似乎无法加载我的 appsettings.Production.json 文件。

bash$ ASPNETCORE_ENVIRONMENT=Production dotnet run
Using launch settings from /Properties/launchSettings.json...
Hosting environment: Development
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

最终,我尝试根据我构建的环境部署特定的连接字符串。有没有更好的方法来做到这一点?

更新

@Chris 在下面的回答有所帮助,此外我还发现了以下内容:

每个 IIS 应用程序池 如果您需要为在独立应用程序池中运行的单个应用程序设置环境变量(在 IIS 10.0+ 上受支持),请参阅 IIS 参考文档中环境变量主题的 AppCmd.exe 命令部分。

这让我可以为每个应用程序池设置不同的环境

【问题讨论】:

  • 展示你如何处理代码中的appsettings.{environment}.json文件
  • @Set 完全正确。您需要 appsettings.production.json 用于生产,appsettings.staging.json 用于暂存,appsettings.development.json 用于开发。要记住的一件事是,如果没有找到其他 appsettings 文件,则使用 appsettings.json
  • @JamieTaylor:appsettings.json总是被使用。特定于环境的文件只是覆盖。
  • @ChrisPratt 确实。
  • 我现在了解环境特定的 appsettings 文件,但需要找到一种设置环境的方法。我无法在服务器上设置环境变量,因为服务器同时运行暂存和生产

标签: asp.net-core-2.0 asp.net-core-configuration


【解决方案1】:

该文档不适用于旧版本的 ASP.NET Core。那里的所有内容仍然适用,并且都已布置好,所以我不确定究竟是从哪里来的混乱。

在最简单的形式中,您只需创建一个或多个appsettings.{environment}.json 文件。默认情况下,首先加载appsettings.json,然后,如果存在,则加载与当前环境匹配的appsettings.{environment}.json 文件。这允许您覆盖主 appsettings.json 文件中的设置,特别是针对环境。但是,更好的方法是只将不受环境影响的全局设置放在appsettings.json 中,然后将所有特定于环境的设置留给特定于环境的文件。

无论如何,在部署应用程序时,所有设置文件都会被复制。 ASP.NET Core 项目不像旧的 ASP.NET 项目那样基于特定配置发布。这意味着相同的已发布文件可以部署在多个不同的环境中,而无需重新发布。

运行时使用的环境由ASPNETCORE_ENVIRONMENT 环境变量的值决定。只需在服务器上将其设置为应有的值,就可以开始了。

如果您在 IIS 后面运行,则需要多做一步。默认情况下,应用程序池不会加载到环境变量中。您可以通过在 IIS 中编辑应用程序池的高级属性并将“加载用户配置文件”设置更改为 true 来更改此设置。

【讨论】:

  • 是的,对不起。我已经在我的答案中更新了它。至于第二个问题,我不确定你到底指的是什么。然而,从某种意义上说,这并不重要。你可以使用任何一个。应用程序池设置的名称很奇怪。它实际上也会引入系统环境变量。
  • 这很有趣。我也总是在系统变量中设置环境,但我总是需要在应用程序池上更改该设置。这可能是与 IIS、Windows Server 或两者的版本特定的不一致。我的组织目前正在使用 2012 R2 数据中心服务器,当然它带有 IIS 8.5。
  • 为什么以世上所有美好和正确的事物的名义,你会这样做?同一台服务器不应该容纳多个环境。你只是自找麻烦。
  • 因为我有一个服务器,它为许多不同的站点运行 API,有些是临时的,有些是生产的。我宁愿答案不是将 1 台服务器更改为 7 台!
  • @ChrisPratt Trouble 要求我的老板每月再支付 200 美元来运行一个新的 AzureVM 以不同地设置一个环境变量 ;-) 并非所有开发人员都有无限的资源(或有时间进行严格的分期发布)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多