【问题标题】:.NET Core - Nuget Pack of UniTest Project shows warning "The assembly is not inside the 'lib' folder".NET Core - UniTest 项目的 Nuget 包显示警告“程序集不在 'lib' 文件夹内”
【发布时间】:2019-04-04 10:44:12
【问题描述】:

我正在尝试将 UnitTest 项目打包为 Nuget 包,如果我构建项目,我总是会收到以下警告:

大会 'content\SpecFlow.MSDependencyInjection.SpecFlowPlugin.dll' 不是 在“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 包,它仍然会产生此错误,但此 Nuget 包中的两个依赖项不会。对我来说,这似乎是 Nuget-Packages 的一个问题......

【问题讨论】:

  • 您的屏幕截图仍显示Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.dll 的警告,因此与您所说的仅具有两个 nuget 依赖项的内容不符。也许您仍在打包测试项目,而这些警告来自该项目,而不是您的新类库项目。
  • @zivkan 我的意思是,如果我删除所有 Nuget-Packages 并且只添加我的 Nuget-Package 我仍然会收到错误消息。屏幕截图包含我的项目所需的所有 Nuget 包。我无法删除 TestAdapter,因为它包含我需要的类。抱歉,如果不清楚。

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


【解决方案1】:

我不能 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 的单个方法调用。这样您就可以打包和共享类库而不会发出警告。打包单元测试似乎不寻常,讨论为什么要这样做、打算解决什么问题以及打包测试是否真的是实现它的最佳方式会很有趣。不幸的是,Stack Overflow 不是一个讨论的好地方,而且经常被积极劝阻。

【讨论】:

  • 同意 XY 问题。 XUnit 在其 xunit.core 包中添加了构建工具,以确保人们在默认情况下得到凌乱的包,并告诉用户使用框架或抽象库来编写共享测试代码。
  • 感谢您的详细回答@zivkan!我更新了我的答案 - 我改变了我的项目结构,所以它是一个类库,但无济于事...... :(
  • 你是对的,这是一个 XY 问题。我重组了我的代码并删除了与 Microsoft UnitTesting Framework 相关的所有内容。我让它框架独立,现在一切正常。 (我自己的 Nuget 包也有一个小错误......)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 2019-01-28
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多