.NET Core - Nuget Pack проекта UniTest показывает предупреждение «Сборка не находится в папке« lib »» - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь упаковать проект UnitTest в пакет Nuget и всегда получаю следующие предупреждения при сборке своего проекта:

сборка 'content \ SpecFlow.MSDependencyInjection.SpecFlowPlugin.dll »не находится в папке« lib »и, следовательно, он не будет добавлен в качестве ссылки, когда пакет будет установлен в проект.Переместите его в папку 'lib', если на него нужно сослаться.

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

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <Version>0.1.0</Version>
    <IsPackable>true</IsPackable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
    <PackageReference Include="MSTest.TestAdapter" Version="1.4.0" />
    <PackageReference Include="MSTest.TestFramework" Version="1.4.0" />
    <PackageReference Include="SpecFlow" Version="3.0.188" />
    <PackageReference Include="SpecFlow.MSDependencyInjection.SpecFlowPlugin" Version="1.0.2" />
    <PackageReference Include="SpecFlow.MsTest" Version="3.0.188" />
    <PackageReference Include="SpecFlow.Tools.MsBuild.Generation" Version="3.0.188" />
  </ItemGroup>

</Project>

По-прежнему появляется ошибка, если я копирую файлы впапка lib пакета Nuget.Я в недоумении, что мне нужно изменить, чтобы это предупреждение исчезло.Честно говоря, я даже не уверен, почему он появляется в первую очередь, потому что у меня есть другой проект, который прекрасно работает без этой ошибки.

Обновление 1:

После подробного ответа от @zivkan я изменил структуру своего проекта, чтобы он больше не был проектом UnitTest.

enter image description here

К сожалению, ошибки все еще появляются, если мой проектбиблиотека классов ...

enter image description here Снимок экрана со всеми пакетами Nuget, которые нужны мне для работы моего проекта

Если ятолько добавить мой собственный Nuget-пакет, который состоит из двух зависимостей (Microsoft.Extensions.DependencyInjection и SpecFlow), он по-прежнему выдает эту ошибку, но две зависимости в этом Nuget-пакете этого не делают.Мне кажется, это проблема с Nuget-Packages ...

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Я не уверен на 100%, но я предполагаю, что, поскольку в случае csproj-файлов в стиле SDK при сборке в выходной каталог обычно записывается только dll вашей сборки.Когда вы запускаете не тестовый netcoreapp, dotnet cli проверяет, какие ссылки на проекты и ссылки на nuget у вас есть, и настраивает загрузчик сборок для загрузки из их «исходных» расположений, а не копирует все сборки в папку bin вашего приложения.Возможно, инфраструктура модульного тестирования не поддерживает загрузку сборок таким образом и создает Content элементов из каждой библиотеки DLL, что говорит шагу build о копировании содержимого (в данном случае библиотеки DLL) в выходной каталог (bin\$(Configuration)\$(TargetFramework)).).Поэтому, когда вы запускаете модульные тесты, инфраструктура модульных тестов содержит все необходимые сборки в одном каталоге, в то время как это обычно не относится к не тестовым проектам.

Далее необходимо понимать, что когда NuGet упаковывает проектон ищет элементы MSBuild типа Content и помещает их копии в каталоги nupkg content и contentFiles.Из-за того, как работает NuGet, компилятору передаются только библиотеки dll в каталогах lib\ или ref\ внутри nupkg, поэтому любые библиотеки dll, имеющие каталог содержимого, не будут переданы компилятору, поэтому ваш проект, ссылающийся на этот nupkgне может использовать классы в этих библиотеках.Это не то, как люди обычно намереваются использовать пакеты NuGet, и поэтому NuGet генерирует предупреждение.

Итак, я считаю, что причина, по которой вы получаете это предупреждение, заключается в том, что вы упаковываете тип проекта, который не предназначен длябыть упакованнымТип проекта делает некоторые необычные вещи для того, чтобы работать, что вызывает предупреждения NuGet, потому что обычно, когда эта необычная вещь делается, это ошибка.

Я полагаю, что это случай XY проблемы .Я предполагаю, что вы упаковываете проект модульных тестов, потому что вы хотите поделиться некоторыми полезными кодами, полезными для тестов, возможно, некоторыми имитациями или кодом инициализации объекта.В этом случае я рекомендую вам создать новый проект classlib, поместить туда свой общий код, оставив все свои тестовые примеры в тестовом проекте netcoreapp, даже если это всего лишь один вызов метода в classlib.Таким образом, вы можете упаковать и поделиться библиотекой классов без предупреждений.Упаковка модульного теста кажется необычной, и было бы интересно обсудить, почему вы хотите это сделать, какую проблему вы собираетесь решить, и если упаковка теста действительно является лучшим способом ее достижения.К сожалению, переполнение стека не является хорошим местом для дискуссий, и его часто не поощряют.

0 голосов
/ 04 апреля 2019

возможно, вы пропустили файл, перейдите по этой ссылке для получения полной информации: https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package#Package_Conventions

...