.Net Core использует файл deps json , чтобы понять зависимости приложения, которое оно будет запускать.Как SomeProject.deps.json
.Насколько я понимаю, этот файл в основном сопоставлен с DependencyContext.cs .И тогда эта же сборка Microsoft.Extensions.DependencyModel
имеет DependencyContextWriter
, которая запишет модель в файл json.
Существует также GenerateDepsFile.cs , который является задачей MSBuild и выполняется CLI dotnet, который запускает msbuild, который запускает эту задачу для генерации этого файла.Он использует файл блокировки project.assets.json
, сгенерированный восстановлением NuGet, в качестве входных данных, а затем сгенерирует фактический файл deps.json
как часть процесса сборки \ публикации
Когда я создаю проект ASP.Net Core, я вижутакие блоки в файле deps.Это самый простой пример
"targets":{
...
"Microsoft.AspNetCore.DataProtection.Abstractions/2.1.1": {
"compile": {
"lib/netstandard2.0/Microsoft.AspNetCore.DataProtection.Abstractions.dll": {}
},
"compileOnly": true
},
...
}
А фактическая упаковка содержит только эту сборку внутри lib\netstandard2.0\Microsoft.AspNetCore.DataProtection.Abstractions.dll
.
Мой вопрос в том, как dotnet cli и msbuild понимают, что эта сборка compileOnly
, поскольку я не вижу свойства compileOnly
в RuntimeLibrary классе.И я не могу найти никакой compileOnly
логики в SDK репо .Когда я генерирую project.assets.json
с помощью RestoreRunner.RunAsync , одна и та же сборка используется как в разделе компиляции, так и во время выполнения:
"Microsoft.AspNetCore.DataProtection.Abstractions/2.1.1": {
"type": "package",
"compile": {
"lib/netstandard2.0/Microsoft.AspNetCore.DataProtection.Abstractions.dll": {}
},
"runtime": {
"lib/netstandard2.0/Microsoft.AspNetCore.DataProtection.Abstractions.dll": {}
}
},
, поэтому один и тот же пакет существует в compile
иruntime
разделы и сам пакет nuget не имеют никаких указаний на то, что сборка должна использоваться только в разделе компиляции.
Мне нужно создать этот файл deps.json, и я просто хочу понять, как определяется compileOnly
.