我在Azure DevOps服务器上创建了发布管道,我遇到了一些问题。
我如何能改变.net核心配置文件(appsettings.EnvName.json)的属性。
当我在框架上创建应用程序时,我有 parameters.xml
其中我将XPath设置为value,默认值和属性名。在流水线上我设置了key-value。但是在net core应用中,这个方法不工作=)
我想用差不多的方法。我会用什么来表示值的路径及其值。比如说
ConnectionStrings.Db1="Server={DB1.Server};Database={DB1.DbName};Trusted_Connection = True;"
ConnectionStrings.Db2="Server={DB2.Server};Database={DB2.DbName};Trusted_Connection = True;"
现在我添加了一个步骤 在远程服务器上执行一个任意的powershell脚本。
$jsonFile = 'appsettings.Template.json'
$jsonFileOut = 'appsettings.Production.json'
$configValues =
'ConnectionStrings.Db1="Server={DB1.Server};Database={DB1.DbName};Trusted_Connection = True;"',
'ConnectionStrings.Db2="Server={DB2.Server};Database={DB2.DbName};Trusted_Connection = True;"'
$config = Get-Content -Path $jsonFile | ConvertFrom-Json
ForEach ($item in $configValues)
{
$kv = $item -split "="
Invoke-Expression $('$config.' + $kv[0] + '="' + $kv[1] + '"')
}
$config | ConvertTo-Json | Out-File $jsonFileOut
但我不太喜欢这个方案,怎样才能用更漂亮的方式来做同样的事呢?
dotnet core以不同的方式处理这个问题。基于app.config转换的完整框架。这意味着,你定义了一个文件,然后针对给定的构建配置(如Debug、Release或你自己的)进行转换。在dotnet core中,你为每个环境定义了appsettings.json。这非常好,因为所有的设置都在你编译的应用程序中。然后在运行时基于 ASPNETCORE_ENVIRONMENT
环境变量选择一个合适的设置。因此,你可以在不重新编译的情况下为你的所有环境提供一个包。为了受益于此,你必须为每个环境定义文件,但这不是转换。这是一个完整的文件。
例如,你的本地开发环境的文件可能是这样的。
{
"ConnectionStrings": {
"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
},
}
而你的开发环境的文件是这样的 appsettings.dev.json
像这样。
{
"ConnectionStrings": {
"BloggingDatabase": "Server=102.10.10.12\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
},
}
然后配置加载这个文件,你必须要配置 Startup
方法,这将加载你所有的应用程序设置文件,然后根据环境变量使用适当的文件。
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}
这将加载所有的appsettings文件,然后根据环境变量使用适当的文件。
要设置这个变量,你可以在命令提示符下使用这个命令。setx ASPNETCORE_ENVIRONMENT Dev
或这个Powershell [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Dev", "Machine")
我希望它能帮助你了解dotnet core上的设置如何工作。如果你需要更多的指导,请查看以下链接。
总而言之,你不需要改变你的设置在发布管道。你需要预先准备好每个环境的完整文件,在那里你要托管你的应用程序。你可以有兴趣根据你的管道中的变量来替换文件中的一些值。你可以考虑以下几个选项
当你不想直接在源代码中保留你的秘密时,这是很有用的。
编辑
如果你想替换appsettings文件中的值,其中一个选项是token替换。要做到这一点,你必须先在你的文件中保留token来代替值。例如 #{SomeVariable}#
将被您的管道中的SomeVariable`的值所取代,以确认您的管道中的 代币.