msbuild的GenerateRuntimeConfigurationFiles的目的是什么?

15
我将一个netcore1.1项目升级到了新的VS2017/csproj版本。
仅在我的测试项目中,它添加了以下内容:
<PropertyGroup>
  <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>

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

  • ProjectName.Tests.runtimeconfig.json
  • ProjectName.Tests.runtimeconfig.dev.json
这些设置和文件是什么,为什么我需要它们?
它们为何只生成在我的测试项目中?
1个回答

15

这些是针对.NET Core项目的特定设置,指定:

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

"经典" .NET Framework 项目也有一种让应用程序设置一些运行时设置的概念。这是通过具有 .exe.config 文件实现的(如果存在项目中的App.config文件,则会从中构建)。您可以将runtimeconfig.json视为 "新的.exe.config",但只有少数重叠关注点。


一些项目有这个设置而另一些没有,可以吗?从你的回答来看,这似乎是一个重要的设置,应该总是设置好的?(奇怪的是,我以前从未使用过它,也从未遇到过问题?) - grokky
这些文件是专门针对.NET Core项目的。 - Martin Ullrich
5
任何可“运行”的项目都需要生成runtimeconfig文件。默认情况下,EXE项目是“可运行”的,因此当您具有“OutputType = Exe”时,“GenerateRuntimeConfigurationFiles”属性默认为“true”。但是,对于测试项目,没有“OutputType = Test”属性可以知道这是一个测试项目。但是测试项目是“可运行”的,因此它们需要生成runtimeconfig文件。因此,迁移工具会在测试项目上设置此属性以便生成该文件。 - Eric Erhardt
@EricErhardt 这是很好的信息,可能应该单独回答...我删除了所有这些属性,但是我的所有测试仍然有效。奇怪? - grokky
另外,dotnet cli xunit 模板不包括它。 - Jaanus Varus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接