我有一个.NET Core构建管道,该管道用于在Azure DevOps上运行一些测试。每个环境的设置都存储在配置文件中,例如:
appsettings.json
appsettings.qa.json
appsettings.test.json
构建非常基础-包含dotnet restore
,dotnet build
和dotnet test
任务:
ASPNETCORE_ENVIRONMENT
环境变量在构建管道的Variables部分中设置:
这些构建在包含多个构建代理(私有的,未托管的)的VM上运行。
现在很怪异的部分-有时构建会选择错误的设置!。
经过一些调查并添加了更多日志后,我们意识到ASPNETCORE_ENVIRONMENT
值有时为Development-Selfhost
,而不是QA
。该值似乎来自测试项目引用的项目的launchsettings.json
文件:
{
"profiles": {
"MyProject.PublicApi": {
"commandName": "Project",
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development-Selfhost"
},
"applicationUrl": "http://localhost:5028/"
}
}
}
根据Use multiple environments in ASP.NET Core,使用launchSettings.json
启动应用程序时使用dotnet run
文件:
launchSettings.json
被读取(如果可用)。environmentVariables
中的launchSettings.json
设置会覆盖环境变量。
将launchSettings.json
添加到.gitignore
解决了我的问题,但是,我试图理解为什么如果我不在构建管道中执行dotnet run
命令,它为何使用这些设置。另外,为什么这种行为如此随机?有时它使用正确的设置,有时却没有。
我已经检查了日志,并且可以确认文件launchSettings.json
已复制到测试项目的bin
文件夹中。
我尝试为ASPNETCORE_ENVIRONMENT
设置一个其他地方没有设置的其他值:
{
"profiles": {
"MyProject.PublicApi": {
"commandName": "Project",
"launchBrowser": false,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Rui"
},
"applicationUrl": "http://localhost:5028/"
}
}
}
行为基本上是相同的-有时它使用管道中设置的值,有时它会使用launchSettings.json
中设置的值并且会失败,因为没有相应的配置文件:
System.IO.FileNotFoundException:找不到配置文件'appsettings.Rui.base.json',它不是可选的。
代替使用单独的appsettings。[environment] .json文件,您可以使用一个appsettings.json文件并使用Azure DevOps中的file transform task对其进行转换。该任务将用管道变量中的值替换所有匹配的值。这具有从纯文本代码中删除您的环境设置的附加好处,并使它们由构建/发布管道拥有。但是,此方法的主要缺点是对设置的任何更改都需要更新所有管道。