Пользовательская задача msbuild пытается загрузить зависимость с неверной версией - PullRequest
1 голос
/ 06 октября 2019

У меня есть пользовательский процесс публикации, который сначала объединяет несколько сборок в одну через 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>

Макет пакета выглядит следующим образом:

enter image description here

Неожиданно во время публикации этот шаг завершается с ошибкой:

задача неожиданно завершилась неудачей. Не удалось загрузить файл или сборку '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, который имеет несколько версий, но все задачи должны согласовываться для его работы.

1 Ответ

0 голосов
/ 07 октября 2019
  1. Как и Lex Li , упомянутый в комментарии, 12.0.2 - это версия пакета NuGet, которая соответствует версии сборки 12.0.0.0. Таким образом, система пытается загрузить правильную версию сборки.
  2. В соответствии с task-isolation-and-dependencies.md , связанной с этим проблемой и т. Д. Пользовательских задач MsBuildимеют серьезные ограничения.
  3. Сам MsBuild включает в себя зависимость от Newtonsoft.Json 11.0.1, поэтому пользовательские задачи не могут загрузить любую другую версию этой зависимости.

Обходные пути:

  1. Используйте ту же версию зависимости, что и MsBuild. Я думаю, что этот подход хрупок и не должен использоваться.
  2. Создайте и упакуйте консольное приложение вместо пользовательской задачи MsBuild. Я выбрал этот подход, потому что он легко расширяемый и позволяет нам использовать любую версию зависимости. В блоге Нейта дается обзор подхода.
  3. Поскольку Мартин Уллрих , упомянутый в комментарии, мы можем использовать задачу с границами изоляции. ContextAwareTask.cs демонстрирует подход.
...