PackageReference 不将 dll 复制到使用者(测试)项目输出,其中 ExcludeAssets =“runtime”且 PrivateAssets =“none”

fl0*_*chi 2 c# msbuild nuget packagereference

这里简单设置:

  • 项目A - .NET 4.7.2框架库项目
    • 封装参考SeriLog 2.9.0
      • 排除资产=“运行时”,
      • PrivateAssets=“none”,这是可选的,因为默认情况下它应该复制 DLL(设置=“运行时”)
  • TestProject B - .NET 4.7.2框架单元测试项目
    • 项目 A 添加为 ProjectReference
    • SeriLog DLL 和所有依赖项应复制到此处

输出: SeriLog DLL不会复制到ProjectA的输出文件夹,也不会复制到TestProject B从我的角度来看, TestProjectB应该包含 SeriLog.dll。我错过了什么吗?或者还有其他选择可以实现这一目标吗?

备注: 据我从PackageReference 格式规范中理解,我正确使用了属性。

ExcludeAssets属性控制已定义该属性的项目的资产PrivateAssets控制使用项目 A 的项目的流量。

ziv*_*kan 5

从您链接的文档中:

排除资产:

这些资产不会被消耗

运行:

lib 和runtimes 文件夹的内容并控制是否将这些程序集复制到构建输出目录

因此,ExcludeAssets="runtime"明确表示“不要复制 dll”。我建议删除ExcludeAssets和的任何使用PrivateAssets,并让 NuGet 使用其默认值。如果您不希望 NuGet 的默认行为,请开始使用这些关键字。

然而,还有另一件事正在发生。你说你的测试项目是一个非SDK风格的项目。可以从 SDK 样式项目以 .NET Framework 为目标,但不幸的是 Visual Studio 的模板将它们称为“.NET Core”或“.NET Standard”,因此人们错误地认为他们无法以 .NET Framework 为目标。无论如何,虽然包对于使用 PackageReference 的项目来说是可传递的,即使没有引用任何包,SDK 样式的项目也始终是 PackageReference。然而,非 SDK 样式的项目则不然。您要么需要在项目中拥有一个 PackageReference,要么将 MSBuild 属性显式设置RestoreProjectStylePackageReference。否则,NuGet 将查找 packages.config 文件,如果未找到,NuGet 会认为该项目根本不使用 NuGet。

不过,现在我发现您的测试项目几乎肯定包含对包的引用,至少是测试框架本身。如果这些引用是通过packages.config 进行的,则这是已知的不兼容性。具有对 PackageReference 项目的项目引用的 packages.config 项目无法完全正常工作。反过来有更好的兼容性,或者也可以将测试项目迁移到 PackageReference。老实说,我强烈建议您将所有项目迁移到 SDK 样式,即使您继续以 .NET Framework 为目标。这是 .NET 的未来,并且工具会更好地工作。少一些这些小问题。

如果测试项目已经在使用 PackageReference,那么问题就在于它ExcludeAssets="runtime"正在被传递应用,并且通过将其从引用的项目中删除,它将自动流向测试项目。