.net core dotnet运行未应用正确的环境名称?
当我在发布概要文件方面遇到问题时,我决定使用.net core 3创建一个小型测试控制台应用程序,并查看是否设置了环境变量以及是否读取了相应的appsettings.json文件 好了,开始吧.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
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]
containsTest
谢谢,我添加了nuget包来处理命令行args,然后对环境变量进行了更改。请参见上面的编辑2。在msbuild发布期间,没有方法设置此值,因为除了使用命令行参数外,发布似乎不会更改控制台应用的此值,只有web应用您需要在目标计算机上定义环境变量。然后通过代码访问此环境变量。请参阅并查看。这说明了为什么环境变量必须在目标上设置,并且不能是已发布应用程序的一部分。TLDR:应用程序应该从环境中获取配置,并且相同的二进制文件(而不是不同的二进制文件)应该理解生产环境和开发环境。
if (args != null)
{
if (args.Length > 0)
{
Environment.SetEnvironmentVariable("Environment", args[1]);
}
}