msbuild的GenerateRuntimeConfigurationFiles的目的是什么?

gro*_*kky 4 msbuild csproj .net-core visual-studio-2017

我将netcore1.1项目升级到新的VS2017/csproj.

仅在我的测试项目中,它补充说:

<PropertyGroup>
  <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我做了一些挖掘,发现它在bin目录中生成这些文件:

  • ProjectName.Tests.runtimeconfig.json
  • ProjectName.Tests.runtimeconfig.dev.json

这个设置和这些文件是什么,为什么我需要它们?

为什么他们只为我的测试项目生成?

Mar*_*ich 8

这些是特定于.NET Core项目并指定的

  • 使用哪个运行时和版本.通常Microsoft.NETCore.App."主机框架解析器"在shared文件夹内查找匹配的文件夹(例如C:\Program Files\dotnet\shared\Microsoft.NETCore.App\1.1.2).这很重要,因为可以并排安装多个运行时,并且主机需要知道在运行时使用哪个运行时dotnet myapp.dll.
  • 运行时的其他选项.最突出的可能是在"桌面"和"服务器"模式之间切换的垃圾收集设置.当你设置<ServerGarbageCollection>true</ServerGarbageCollection>int csproj文件时,这将导致设置一个值runtimeconfig.json.(对于Web项目,此属性默认为true)
  • 主机的其他选项.additionalProbingPath例如,设置为包含已还原包的本地NuGet缓存.您可能已经注意到,引用NuGet包不会导致其dll文件被复制到输出目录(默认情况下).主机使用额外的探测路径来查找在此位置引用的包/ dll(实际上它是两步查找:deps.json告诉主机要使用哪些包,此属性告知在哪里查找此包).由于这仅用于开发并且不应该在已发布的输出中结束(因为这意味着依赖于目标上的NuGet缓存),因此将此设置放入runtimeconfig.dev.json.

"经典".NET Framework项目还有一个让应用程序设置一些运行时设置的概念.这是通过拥有一个.exe.config文件(App.config如果存在,将从项目中的文件构建)来完成的.您可以将其runtimeconfig.json视为"新的.exe.config",但唯一有一些重叠的问题.

  • 需要为"runnable"的任何项目生成runtimeconfig文件.默认情况下,EXE项目是"可运行的",因此当您具有`OutputType = Exe`时,GenerateRuntimeConfigurationFiles属性默认为"true".但是,对于测试项目,没有`OutputType = Test`属性知道这是一个测试项目.但测试项目是"可运行的",因此需要生成runtimeconfig文件.因此,迁移工具会在测试项目上设置此属性,以便生成它们. (5认同)