我的应用程序中存在无法解释的行为。
我有一个公共图书馆,我;我在多个项目中使用过。在这个库中,我使用System.Environment类来访问环境变量,就像这样.
string value = System.Environment.GetEnvironmentVariable("MY_ENV_VARIABLE");
我决定为这个共享库创建一个nuget包,在将引用移动到nuget之后,value
不再设置,就好像搜索到的env_variable不存在一样。
在一个asp.net核心项目中,我正在设置环境变量
launch.json=>
"environmentVariables": {
"MY_ENV_VARIABLE": "my value"
},
为什么会有这种行为?切换回直接引用项目,一切正常。
在我写下评论后,我意识到我忘记在操作系统级别为控制台项目设置正确的环境变量。我设置了ASPNETCORE_ENVIRONMENT
,但没有设置DOTNET_ENVIRONMENT
。调试期间一切正常,但有一次我尝试运行已发布的可执行文件-boom。
我想我需要写这个,这样我就不会再忘记了。
短版本
launch.json
仅在调试期间使用。确保在顶级项目的launch.json
中设置了环境变量。如果您想使用Visual Studio之外的开发设置启动应用程序,则需要在操作系统级别设置DOTNET_ENVIRONMENT
。其他任何环境变量也是如此。
解释
环境变量由操作系统环境提供,它们不是从launch.json读取的。无论代码在哪里,访问它们都不会改变。如果你不能读取你想要的环境变量,那就意味着它没有设置。
环境变量通常设置在操作系统级别(在所有操作系统中(。它们也可以在批处理/shell文件中临时设置。父应用程序还可以设置子进程启动时使用的环境变量。这就是launch.json
的用途。
Visual Studio和Visual Studio编写代码来存储调试配置文件、设置以及它们在仅开始调试主可执行文件时设置的环境变量。它根本没有在生产中使用。如果您在调试过程中遇到问题,请确保在ASP.NET Core项目的launch.json中设置环境变量。更好的做法是,使用项目的Settings > Debug
页面设置环境变量,以确保您为正确的配置文件设置了环境变量。
生产/测试/暂存
在生产中,您需要在操作系统中设置环境变量。
如果使用IIS,还可以在用于配置主机的web.config
文件中设置它们。这将允许您使用不同的设置在同一台机器上部署同一个应用程序两次,例如用于测试和暂存。您还可以通过为每个站点使用不同的基本设置,将其用于多租户部署。
如果使用容器,还可以在容器级别设置环境变量。这允许您在启动容器时使用具有不同设置的相同映像,甚至部署新设置