【问题标题】:Visual Studio Net Core: Switch Environment Variables for Multiple ProjectsVisual Studio Net Core:切换多个项目的环境变量
【发布时间】:2020-11-30 10:54:34
【问题描述】:

我们在一个解决方案中有多个项目,并且需要一种方法来快速将环境更改为另一个,例如 QA。我们的解决方案中有 8 个项目。这怎么能做到,而不需要手动遍历每个?

Visual Studio 中有快速设置吗?

注意:我们有多个 API 项目,它们没有依赖关系。

【问题讨论】:

标签: c# .net visual-studio powershell .net-core


【解决方案1】:

解决此问题的一种方法是拥有一个解决方案级别的“环境”文本文件,每个 API 项目都可以“链接”到该文件。然后在每个 API 项目的ProgramStartup 逻辑中,让他们读取这个全局文件来设置运行时的环境。

例如,这是我的示例解决方案,其中包含 2 个 API 项目:

第 1 步:创建“全局”环境文件

首先,我添加了一个解决方案级别的文本文件 Environment.txt,它只包含我希望在其下运行所有​​ API 的“当前”环境的名称:

Performance

第 2 步:将 Environment.txt 文件链接到每个 API 项目

其次是链接 Environment.txt 文件到每个 API 项目,使用 Visual Studio 的 Add Existing Item 对话框,并选择 Add As Link 选项:

请注意,链接文件上的图标与普通文件略有不同。

第 3 步:确保 Environment.txt 实际复制到 Bin 目录

第三是确保每个添加的链接文件的Copy to Output 选项设置为Copy Always

第 4 步:一小段代码...

最后,在每个 API 项目的 Program.cs 文件中,您可以读取该文件并在运行时设置环境:

namespace MicroserviceSandbox.ApiTwo
{
    using System.IO;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    // *** Dynamically set the environment.
                    var binDirectoryPath = new FileInfo(typeof(Program).Assembly.Location).Directory.FullName;
                    var environmentFilePath = Path.Combine(binDirectoryPath, "Environment.txt");
                    var environment = File.ReadAllText(environmentFilePath);
                    webBuilder.UseEnvironment(environment);
                    // ***

                    webBuilder.UseStartup<Startup>();
                });
        }
    }
}

假设

  • 上述 C# 代码 sn-p 假定您的 API 项目使用的是 ASP.NET Core v3.1。

【讨论】:

  • 是的,这将确保每个项目都使用相同的环境。但这并没有解决问题的第二部分:如果您有 DEV、QA、UAT、... 环境怎么办?如何轻松切换这些?我知道,类似于“Debug”和“Release”你可以在VS中创建多个配置,但是如何用C#代码sn-p来引用这些呢?
  • @Matt - 您指的是环境特定的 appsettings.json 文件吗?我相信只要它们遵循标准命名约定 appsettings.[environment].json 就已经解决了,其中 environment 可以与您在解决方案级别环境文件中指定的相同。并且任何共享设置都可以在 appsetting.json 文件中(非环境特定的)。
  • 这是一个很好的答案,我赞成,但要求我们对现有的当前项目设置进行太多更改
  • @ajawad987 - 是的,确实,在 .json 文件中可以有一个环境部分,因此您不需要单独执行此操作。我已经在我的answer 中更新了它。
【解决方案2】:

如您的屏幕截图所示,“应用程序环境”由该“Windows 进程环境变量”确定。只有正在运行的项目需要设置该环境变量,而不是该环境变量引用的项目。

如果您同时运行多个项目: 环境变量保存到项目文件夹中的 launchSettings.json 文件中。您可以使用 PowerShell 脚本一次更新多个项目的启动设置。

【讨论】:

  • 注意:我们有多个 API 项目,它们没有依赖关系。并且所有 5 个 api 项目都在运行
  • 有没有原生的方式,在 VS 中不使用 powershell?谢谢
  • 我不知道
  • 您是否有一个示例 powershell 脚本?我可以用作示例模板
  • 这是一个很好的答案,可能是最直接的,如果有人是 powershell 专家,请随时添加
【解决方案3】:

除了使用项目启动设置中的环境变量,您还可以使用系统环境变量。

为此,您必须从启动设置中删除“ASPNETCORE_ENVIRONMENT”并在系统环境变量中进行设置。 在此处查看文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-3.1#set-the-environment

注意:同一机器上的每个项目在启动设置中未设置“ASPNETCORE_ENVIRONMENT”都将使用系统环境变量

【讨论】:

    【解决方案4】:

    下面的文章中描述了几件事:

    1. Automatically set appsettings.json for dev and release environments

    2. launchSettings.json in ASP.NET

    3. Various configuration json files in ASP.NET

    第一个是如何为多个环境设置 appsettings.json 的分步说明;在第 2 篇文章中,您可以找到有关 launchSettings.json 以及如何配置不同环境变量集的重要信息。在这里,您将找到一个示例,如何为“开发”、“暂存”和“生产”等 3 种不同配置设置环境变量。

    如果您切换部署平台,Startup.cs 中还会调用“StartupDevelopment”或“StartupProduction”等启动约定。

    基本上,要设置它,您需要将这些组合起来正确设置您的环境变量。我会使用ajawad987's answer,但将环境文件路径更改为var environmentFilePath = Path.Combine(binDirectoryPath,$"Environment.{env.EnvironmentName}.txt");,允许根据环境进行设置(变量来自Startup(IHostingEnvironment env) - 您可能需要添加一个可从他的代码访问的全局属性)。他的代码应该添加到所有项目中。请注意,您可以将ASPNETCORE_ENVIRONMENT 设置为系统环境变量,也可以通过dotnet run --environment "Development" 等命令行运行它。

    但请注意,您也可以在launchSetting.json 文件中声明环境变量,例如

    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "Hosting:Environment": "Development"
      }
    },
    

    此 JSON 文件包含与 Visual Studio 配置为用于启动应用程序的每个配置文件关联的项目特定设置。

    另外值得一看的是关于Various configuration json files in ASP.NET的第3篇文章,在那里你可以找到当前ASP.NET Core项目中存在的所有json文件的描述,以及它们在你的项目中扮演的角色。

    遗憾的是 .NET core 的发明者没有实现更直接的实现!

    【讨论】:

    • 这些是很好的资源,但是,我需要一键更改多个项目,而不是多个环境,希望我有更直接的答案
    • 我试着更直接一点,希望现在更清楚。
    猜你喜欢
    • 2016-07-07
    • 2013-01-21
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多