.net core 使用Azure DevOps的Delpoy NetCore应用程序

.net core 使用Azure DevOps的Delpoy NetCore应用程序,.net-core,azure-devops,azure-pipelines,.net Core,Azure Devops,Azure Pipelines,我在Azure DevOps服务器上创建了发布管道,但遇到了一些问题 如何更改.net核心配置文件(appsettings.EnvName.json)中的属性 当我在框架上创建应用程序时,我有parameters.xml,其中我将XPath设置为value、default值和属性名。在管道上我设置了键值。但在net core应用程序上,此方法不起作用=) 我想使用大致相同的方法。我将如何指示该值及其值的路径。例如: ConnectionStrings.Db1="Server={DB1.Serve

我在Azure DevOps服务器上创建了发布管道,但遇到了一些问题

如何更改.net核心配置文件(appsettings.EnvName.json)中的属性

当我在框架上创建应用程序时,我有
parameters.xml
,其中我将XPath设置为value、default值和属性名。在管道上我设置了键值。但在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

但是我真的不喜欢这个解决方案,我怎样才能以一种更漂亮的方式做同样的事情呢。基于app.config转换的完整框架。这意味着您定义了一个文件,该文件后来被转换为给定的构建配置(如调试、发布或您自己的)。在dotnet core中,可以为每个环境定义appsettings.json。这非常有效,因为所有设置都在编译的应用程序中。然后在运行时,根据
ASPNETCORE\u环境
环境变量选择适当的设置。因此,您的所有环境可能都有一个包,而无需重新编译。要从中受益,您必须为每个环境定义文件,但这不是转换。这是完整的文件

例如,用于本地开发的文件可能如下所示:

{
  "ConnectionStrings": {
    "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  },
}
{
  "ConnectionStrings": {
    "BloggingDatabase": "Server=102.10.10.12\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  },
}
和您的开发环境的文件
appsettings.dev.json
,如下所示:

{
  "ConnectionStrings": {
    "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  },
}
{
  "ConnectionStrings": {
    "BloggingDatabase": "Server=102.10.10.12\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
  },
}
然后要配置加载此文件,您必须配置
Startup
方法:

公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddenEnvironmentVariables();
this.Configuration=builder.Build();
}
这将加载所有appsettings文件,然后根据环境变量使用适当的文件

要设置此变量,可以在命令提示符下使用此命令
setx ASPNETCORE\u ENVIRONMENT Dev
或在Powershell
[ENVIRONMENT]中使用此命令:setenvironment变量(“ASPNETCORE\u ENVIRONMENT”、“Dev”、“Machine”)

我希望它能帮助你理解设置是如何在dotnetcore上工作的。如果您需要更多指导,请查看以下链接:

总之,您不需要更改发布管道中的设置。你需要在你要托管你的应用程序的每个环境中预先准备完整的文件。您可能有兴趣根据管道中的变量替换文件中的某些值。你可以在这里考虑一些选项,如

当您不想直接在源代码中保守秘密时,这很有用

编辑

如果要替换appsettings文件中的值,其中一个选项是令牌替换。为此,必须首先在文件中保留标记,而不是保留值。例如,
{SomeVariable}
将被管道中的SomeVariable`值替换,以进行此确认


我了解系统环境,但如果我开始使用此方法,我必须将配置文件保存在存储库中。这种方式对我不合适。我不想将环境配置保存在code repository.Ok中。你检查过我最后的链接了吗?您可以使用tokenreplace或json变量substation。另一种方法是直接在应用程序中使用密钥库。您可以使用Azure Key Vault吗?也许您可以说一种更改属性并将其移动到环境的最佳方法。现在我有两个步骤:1。从工件2复制zip。把它部署到服务器上你能提出另一个问题并多说些什么吗?我有点担心这个评论没有足够的空间来回答你。