0

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

在此处输入图像描述

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

在此处输入图像描述 我的项目工作所需的所有 Nuget 包的屏幕截图

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

4

2 回答 2

2

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

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

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

我相信这是一个XY 问题的案例。我假设您正在打包一个单元测试项目,因为您想共享一些对测试有用的实用程序代码,可能是一些模拟或对象初始化代码。在这种情况下,我建议您创建一个新的 classlib 项目,将您的共享代码放在那里,将所有测试用例留在您的 netcoreapp 测试项目中,即使它只是对 classlib 的单个方法调用。这样您就可以打包和共享类库而不会发出警告。打包单元测试似乎不寻常,讨论为什么要这样做、打算解决什么问题以及打包测试是否真的是实现它的最佳方式会很有趣。不幸的是,Stack Overflow 不是一个讨论的好地方,而且经常被积极劝阻。

于 2019-04-04T14:11:54.913 回答
0

也许您错过了一个文件,请点击此链接了解完整详情:https ://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package#Package_Conventions

于 2019-04-04T11:21:14.243 回答