PackageReference не копирует dll в выходные данные потребительского (тестового) проекта с ExcludeAssets = "runtime" и PrivateAssets = "none" - PullRequest
0 голосов
/ 10 февраля 2020

Простая настройка здесь:

  • Проект A -. NET 4.7.2 Проект библиотеки фреймворка
    • PackageReference to SeriLog 2.9.0
      • ExcludeAssets = "время выполнения",
      • PrivateAssets = "нет", это необязательно, поскольку по умолчанию следует копировать библиотеки DLL (setting = "runtime")
  • TestProject B -. NET 4.7.2 тестовый проект базового модуля
    • Project A добавлен как ProjectReference
    • DLL-библиотека SeriLog и все зависимости должны быть скопированы здесь

Вывод: SeriLog DLL не копируется в выходную папку ProjectA , но также не TestProject B . TestProjectB должен содержать с моей точки зрения SeriLog.dll. Я что-то пропустил? Или какие-либо другие варианты для этого?

Примечания: Насколько я понял из спецификации PackageReference , я правильно использую атрибуты.

Атрибут ExcludeAssets контролирует ресурсы для проекта, в котором он был определен. PrivateAssets управляет потоком проектов, которые используют проект A.

1 Ответ

0 голосов
/ 11 февраля 2020

Из связанных документов:

ExcludeAssets:

Эти ресурсы не будут использованы

время выполнения:

Содержимое папки lib и runtimes и контролирует, будут ли эти сборки скопированы в выходной каталог сборки

, поэтому ExcludeAssets="runtime" явно означает «не копировать dll». Я бы предложил исключить любое использование ExcludeAssets и PrivateAssets и позволить NuGet использовать его значения по умолчанию. Если вам не нужно поведение NuGet по умолчанию, начните использовать эти ключевые слова.

Однако, есть и другая вещь. Вы сказали, что ваш тестовый проект не в стиле SDK. Можно настроить таргетинг на. NET Framework из проекта в стиле SDK, но, к сожалению, шаблоны Visual Studio называют их «. NET Core» или «. NET Standard», поэтому люди ошибочно полагают, что не могут ориентироваться. NET Framework. В любом случае, хотя пакеты являются транзитивными для проектов, использующих PackageReference, проекты в стиле SDK всегда являются PackageReference, даже если на пакеты не ссылаются. или явно установите для свойства MSBuild RestoreProjectStyle значение PackageReference. В противном случае NuGet будет искать файл packages.config, а если он не найден, NuGet считает, что проект вообще не использует NuGet.

Хотя он Теперь мне приходит в голову, что ваш тестовый проект почти наверняка содержит ссылки на пакеты, по крайней мере, саму тестовую среду. Если эти ссылки находятся через packages.config, это известная несовместимость. packages.config проекты, имеющие ссылки на проекты PackageReference проектов d o не полностью работает должным образом. Есть лучшая совместимость с другой стороны, или альтернативно перенести тестовый проект в PackageReference. Честно говоря, я бы настоятельно рекомендовал перенести все возможные проекты в стиль SDK, даже если вы продолжаете ориентироваться на. NET Framework. Это будущее. NET и инструменты работают лучше. Меньше этих маленьких ошибок.

Если тестовый проект уже использует PackageReference, то проблема заключается только в том, что ExcludeAssets="runtime" применяется транзитивно, и, удаляя его из вашего ссылочного проекта, он автоматически переходит к тестовый проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...