>

UnitTest 프로젝트를 Nuget 패키지로 포장하려고하는데 프로젝트를 빌드하면 항상 다음과 같은 경고가 표시됩니다.

The assembly 'content\SpecFlow.MSDependencyInjection.SpecFlowPlugin.dll' is not inside the 'lib' folder and hence it won't be added as a reference when the package is installed into a project. Move it into the 'lib' folder if it needs to be referenced.

내 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>

Nuget 패키지의 lib 폴더에 파일을 복사해도 오류가 계속 나타납니다. 이 경고가 사라지도록 변경해야 할 사항이 없습니다. 솔직히 말하면이 오류없이 잘 작동하는 다른 프로젝트가 있기 때문에 왜 그것이 처음에 나타나는지 잘 모르겠습니다.

업데이트 1 :

@zivkan의 자세한 답변 후 프로젝트 구조가 변경되어 더 이상 UnitTest 프로젝트가 아닙니다.

프로젝트가 클래스 라이브러리 인 경우에도 여전히 오류가 나타납니다 ...

프로젝트가 작동하는 데 필요한 모든 Nuget-Package 스크린 샷

두 개의 종속성 (Microsoft.Extensions.DependencyInjection 및 SpecFlow)으로 구성된 자체 Nuget-Package 만 추가해도 여전히이 오류가 발생하지만이 Nuget-Package의 두 가지 종속성은 그렇지 않습니다. 나에게 이것은 Nuget-Packages에 문제가있는 것 같습니다 ...

  • 답변 # 1

    100 % 확신 할 수는 없지만 SDK 스타일의 csproj 파일을 사용하면 빌드 할 때 어셈블리의 dll 만 출력 디렉토리에 작성됩니다. 테스트되지 않은 netcoreapp를 실행하면 dotnet cli는 어떤 프로젝트 참조 및 너겟 참조를보고 모든 어셈블리를 앱의 bin 폴더에 복사하지 않고 "원래"위치에서로드하도록 어셈블리 로더를 구성합니다. 아마도 단위 테스트 프레임 워크는 이런 방식으로 어셈블리로드를 지원하지 않으며 Content 를 만듭니다.   build 를 알려주는 각 dll에서 항목  내용 (이 경우 dll)을 출력 디렉토리 ( bin\$(Configuration)\$(TargetFramework) )에 복사하는 단계 ). 따라서 단위 테스트를 실행할 때 단위 테스트 프레임 워크에는 단일 디렉토리에 필요한 모든 어셈블리가 있지만 일반적으로 테스트되지 않은 프로젝트에는 해당되지 않습니다.

    다음으로 NuGet이 프로젝트를 압축 할 때 Content 유형의 MSBuild 항목을 찾습니다. nupkg의 content 에 사본을 넣습니다.  그리고 contentFiles  디렉토리. NuGet의 작동 방식으로 인해 lib\ 의 dll 만  또는 ref\  nupkg 내의 디렉토리는 컴파일러에 제공되므로 컨텐츠 디렉토리가있는 dll은 컴파일러로 전달되지 않으므로이 nupkg을 참조하는 프로젝트는 해당 dll의 클래스를 사용할 수 없습니다. 사람들이 일반적으로 NuGet 패키지를 사용하려는 방식이 아니므로 NuGet은 경고를 생성합니다.

    따라서이 경고 메시지가 나타나는 이유는 포장 할 수없는 프로젝트 유형을 포장하기 때문입니다. 프로젝트 유형이 작동하기 위해 흔하지 않은 작업을 수행합니다. 일반적으로이 흔하지 않은 작업이 수행되면 실수이기 때문에 NuGet 경고가 발생합니다.

    이것은 XY 문제의 경우라고 생각합니다. 테스트에 유용한 일부 유틸리티 코드, 일부 모의 객체 또는 객체 초기화 코드를 공유하려고하기 때문에 단위 테스트 프로젝트를 포장한다고 가정합니다. 이 경우 새로운 classlib 프로젝트를 작성하고 공유 코드를 거기에 넣고 netlibapp 테스트 프로젝트에 모든 테스트 케이스를 남겨 두는 것이 좋습니다 (단 하나의 메소드 호출이 classlib에 해당되지는 않더라도). 이렇게하면 경고없이 classlib를 포장하고 공유 할 수 있습니다. 단위 테스트를 포장하는 것은 이례적인 것처럼 보이며 왜 그렇게하고 싶은지, 어떤 문제를 해결하려고하는지 그리고 테스트를 포장하는 것이 실제로 그것을 달성하는 가장 좋은 방법인지 논의하는 것이 흥미로울 것입니다. 불행히도 Stack Overflow는 토론을하기에 좋은 장소가 아니며 종종 적극적으로 권장하지 않습니다.

  • 답변 # 2

    파일을 놓친 것 같습니다. 자세한 내용은이 링크를 참조하십시오. https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package # Package_Conventions

  • 이전 python - Seaborn의 산점도와 lmplot 매개 변수의 차이점
  • 다음 c# - 인스턴스화 된 객체의 색상을 변경하는 방법은 무엇입니까?