У меня есть пользовательский процесс публикации, который сначала объединяет несколько сборок в одну через ILRepack, затем выполняет некоторые другие шаги и, наконец, очищает каталог публикации - удаляет объединенные зависимости из APP_NAME.deps.json, соответствующие сборки и файлы символов.
Для реализации последнего шага я создал пакет NuGet с пользовательской задачей MsBuild. Согласно сообщению в блоге Нейта , я установил PrivateAssets="All"
для отправки всех зависимостей задачи в пакете:
<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2019.1.3" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.9.20" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Update="@(PackageReference)" PrivateAssets="All" />
</ItemGroup>
Макет пакета выглядит следующим образом:
Неожиданно во время публикации этот шаг завершается с ошибкой:
задача неожиданно завершилась неудачей. Не удалось загрузить файл или сборку 'Newtonsoft.Json, версия = 12.0.0.0, культура = нейтральная, PublicKeyToken = 30ad4fe6b2a6aeed'. Не удалось найти или загрузить определенный файл. (0x80131621)
Я не могу понять, почему задача пытается загрузить версию 12.0.0.0, когда у меня есть Newtonsoft.Json 12.0.2 (как указано в PackageReference).
Спасибо за любую помощь!
Обновлено:
В соответствии с этой спецификацией msbuild в настоящее время задачи MSBuild имеют серьезные ограничения:
Задачи в MSBuild - это динамически загружаемые сборки с потенциально отдельными и конфликтующими деревьями зависимостей. В настоящее время MSBuild на .NET Core не имеет изоляции между задачами, и поэтому может быть загружена только одна версия любой данной сборки. Ярким примером этого является Newtonsoft.Json, который имеет несколько версий, но все задачи должны согласовываться для его работы.