使用Azure DevOps的Delpoy NetCore应用程序

问题描述 投票:0回答:1

我在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

但我不太喜欢这个方案,怎样才能用更漂亮的方式来做同样的事呢?

.net-core azure-devops azure-pipelines
1个回答
1
投票

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`的值所取代,以确认您的管道中的 代币.

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.