.NET Core-UniTest Project的Nuget Pack显示警告“程序集不在'lib'文件夹中”

时间:2019-04-04 10:44:13

标签: c# .net-core nuget nuget-package

我正在尝试将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>

如果我将文件复制到Nuget包的lib文件夹中,仍然会出现错误。我不知所措,我需要更改此警告才能消失。坦率地说,我什至不知道为什么会首先出现它,因为我有另一个项目可以正常工作而不会出现此错误。

更新1:

在@zivkan的详细回答之后,我更改了项目结构,因此不再是UnitTest项目。

enter image description here

不幸的是,如果我的项目是类库,错误仍然会出现...

enter image description here 包含工作所需的所有Nuget软件包的屏幕截图

如果我只添加自己的包含两个依赖项(Microsoft.Extensions.DependencyInjection和SpecFlow)的Nuget-Package,它仍然会产生此错误,但是此Nuget-Package中的两个依赖项却不会。对我来说,这似乎是Nuget-Packages的问题...

2 个答案:

答案 0 :(得分:2)

我不确定100%,但是我的猜测是,由于使用SDK样式的csproj文件,因此在生成时,通常仅将程序集的dll写入输出目录。运行非测试netcoreapp时,dotnet cli会查看您拥有的项目引用和nuget引用,并将程序集加载器配置为从其“原始”位置加载,而不是将所有程序集都复制到应用程序的bin文件夹中。也许单元测试框架不支持以这种方式加载程序集,并从每个dll中创建Content项,这告诉build步骤将内容(在本例中为dll)复制到输出目录中(bin\$(Configuration)\$(TargetFramework))。因此,在运行单元测试时,单元测试框架将所有必需的程序集放在单个目录中,而对于非测试项目通常不是这样。

接下来,您需要了解,当NuGet打包项目时,它将查找类型为Content的MSBuild项目,并将它们的副本放入nupkg的contentcontentFiles目录中。由于NuGet的工作方式,仅将nupkg中lib\ref\目录中的dll提供给编译器,因此,您拥有内容目录的任何dll都不会传递给编译器,因此您的项目引用此nupkg的对象不能在这些dll中使用类。人们通常不打算使用NuGet软件包,因此NuGet会生成警告。

所以,我相信收到此警告的原因是因为您要打包的项目类型不是可打包的。项目类型为了正常工作会执行一些不常见的操作,这会触发NuGet警告,因为通常,当完成此不常见的操作时,这是一个错误。

我认为这是XY problem的情况。我假设您要打包一个单元测试项目,因为您想共享一些对测试有用的实用程序代码,也许是一些模拟或对象初始化代码。在这种情况下,我建议您创建一个新的classlib项目,在其中放置共享代码,将所有测试用例留在netcoreapp测试项目中,即使仅是对classlib的单个方法调用而已。这样,您可以打包和共享classlib而不会发出警告。打包单元测试似乎很不寻常,讨论您为什么要这样做,打算解决什么问题以及打包测试是否真的是实现测试的最佳方法将很有趣。不幸的是,Stack Overflow并不是一个进行讨论的好地方,并且通常不鼓励这样做。

答案 1 :(得分:0)

也许您错过了文件,请点击此链接以获取完整详细信息:https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package#Package_Conventions