为每个环境部署不同的连接字符串

Deploy different connection string for each environment

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

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

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

我有一个 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 命令部分。

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

该文档不适用于旧版本的 ASP.NET Core。那里的所有内容仍然适用,并且都已安排好,所以我不确定这里的混乱究竟来自何处。

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

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

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

如果您 运行 落后于 IIS,则需要再采取一步。默认情况下,应用程序池不会在环境变量中加载。您可以通过在 IIS 中编辑应用程序池的高级属性并将设置 "Load User Profile" 更改为 true.

来更改此设置