Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core dotnet运行未应用正确的环境名称?_.net Core - Fatal编程技术网

.net core dotnet运行未应用正确的环境名称?

.net core dotnet运行未应用正确的环境名称?,.net-core,.net Core,当我在发布概要文件方面遇到问题时,我决定使用.net core 3创建一个小型测试控制台应用程序,并查看是否设置了环境变量以及是否读取了相应的appsettings.json文件 好了,开始吧 Program.json using System; using System.Collections.Generic; using System.IO; using System.Text; using Microsoft.Extensions.Configuration; using Microsof

当我在发布概要文件方面遇到问题时,我决定使用.net core 3创建一个小型测试控制台应用程序,并查看是否设置了环境变量以及是否读取了相应的appsettings.json文件

好了,开始吧

Program.json
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.EnvironmentVariables;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Cmd1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");


            var environmentName =
                Environment.GetEnvironmentVariable("ENVIRONMENT");

            // create service collection
            var services = new ServiceCollection();


            // build config
            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", false)
                .AddJsonFile($"appsettings.{environmentName}.json", true)
                .AddEnvironmentVariables()
                .Build();

            // setup config
            services.AddOptions();
            services.Configure<AppSettings>(configuration.GetSection("App"));

            // create service provider
            var serviceProvider = services.BuildServiceProvider();

            var appSettings = serviceProvider.GetService<IOptions<AppSettings>>();

            string env = Environment.GetEnvironmentVariable("Environment");

            Console.WriteLine($" We are looking at {appSettings.Value.TempDirectory} from environment: {env}");
        }
    }
}
appsettings.Local.json

{
  "App": {
    "TempDirectory": "c:\\temp\\rss-hero\\tmp\\"
  }
}
appsettings.Test.json

{
  "App": {
    "TempDirectory": "d:\test"
  }
}
现在,转到命令行并运行dotnet run,我得到

如果我试图在命令行上设置环境,它似乎不会接受。我错过了什么? 如果我使用此控制台应用程序的发布配置文件,也会出现同样的问题

[编辑2] 添加使用命令行参数的功能后

    if (args != null)
    {
        if (args.Length > 0)
        {
            Environment.SetEnvironmentVariable("Environment", args[1]);
        }
    }

运行
dotnet运行时--环境“测试”
。参数
--environment
Test
被传递到
Main
方法的
args
参数中。因此,
args
包含两个元素
args[0]
contains
--environment
args[1]
contains
Test
谢谢,我添加了nuget包来处理命令行args,然后对环境变量进行了更改。请参见上面的编辑2。在msbuild发布期间,没有方法设置此值,因为除了使用命令行参数外,发布似乎不会更改控制台应用的此值,只有web应用您需要在目标计算机上定义环境变量。然后通过代码访问此环境变量。请参阅并查看。这说明了为什么环境变量必须在目标上设置,并且不能是已发布应用程序的一部分。TLDR:应用程序应该从环境中获取配置,并且相同的二进制文件(而不是不同的二进制文件)应该理解生产环境和开发环境。
    if (args != null)
    {
        if (args.Length > 0)
        {
            Environment.SetEnvironmentVariable("Environment", args[1]);
        }
    }