NuGet:未添加运行时文件夹中的程序集的引用

Bra*_*son 14 nuget

我有一个针对两个不同操作系统/框架的项目:

  1. net461 在Windows和
  2. netcoreapp2.0 在OSX上

我正在试图弄清楚如何为NuGet正确打包它.根据这篇文章,我应该能够像这样打包它们:

/runtimes/win/lib/net461/myassembly.dll
/runtimes/osx/lib/netcoreapp2.0/myassembly.dll
Run Code Online (Sandbox Code Playgroud)

当我将NuGet包添加到另一个项目时,打包的程序集不会作为对目标项目的引用添加.

然后我在某处读到你还需要在/ref文件夹中添加引用库,所以我尝试了这个:

/runtimes/win/lib/net461/myassembly.dll
/runtimes/osx/lib/netcoreapp2.0/myassembly.dll
/ref/net461/myassembly.dll
/ref/netcoreapp2.0/myassembly.dll
Run Code Online (Sandbox Code Playgroud)

在这种情况下,程序集将作为对目标项目的引用添加,我可以构建它,但不会将所需的程序集复制到输出文件夹.

关于这一切的文件非常模糊,我很丢失.

我错过了什么?


相关NuGet问题:https://github.com/NuGet/Home/issues/7316


更新:我已经整理了一个示例项目,演示了我想要实现的目标.特别参见自述文件的底部,标题为"NuGet Packaging".

Bra*_*son 11

这是我最终想出/猜到的(因为我最好能告诉他们这里没有官方文件)

  • 添加到/ runtimes文件夹的文件不会自动添加为目标项目的引用.
  • / ref和/ runtime文件夹应该相互结合使用,并且只能用于.NET Core目标.最好我可以.NET Framework目标显然不支持这些文件夹.
  • / ref文件夹用于编译时引用,此处添加的任何内容都将作为对目标项目的引用添加.
  • / ref文件夹中的程序集不需要具有实现 - 每个公共API都可以抛出未实现的异常.实际上,您通常只需获取其中一个实现程序集的副本,并将其声明为编译时API.
  • 我已经读过(但没有测试过自己)/ ref文件夹中的程序集必须是"Any CPU"构建.如有必要,您可以使用CorFlags实用程序为此修补实现程序集.
  • / runtimes文件夹用于为/ ref文件夹中包含的任何引用提供实现程序集.这些程序集在运行时和部署期间使用.
  • / runtimes文件夹可以包含仅在运行时需要的其他程序集,而不需要客户端项目查看.这些附加程序集不会作为引用包含在目标项目中,但可用于运行/部署.
  • 正如其他人所提到的,/ runtimes文件夹中的文件不会复制到构建的输出文件夹中.而是将配置文件放在那里,告诉运行时如何从NuGet缓存中找到/ runtimes文件.
  • 对于.NET Framework目标(即:net461),只需使用/ lib文件夹,因为除了Windows之外没有其他.NET运行时.

把这一切放在一起,我的原始示例应该看起来像这样:

/lib/net461/myassembly.dll                       (net461/Windows Compile and Runtime)
/runtimes/osx/lib/netcoreapp2.0/myassembly.dll   (netcore/OSX Runtime)
/runtimes/win/lib/netcoreapp2.0/myassembly.dll   (netcore/Win Runtime)
/ref/netcoreapp2.0/myassembly.dll                (netcore/* Compile Time)
Run Code Online (Sandbox Code Playgroud)


Jak*_*ake 5

我花了很多时间在Mac和Visual Studio的Visual Studio中的OSX上尝试您的项目。我将尽量坚持事实观察,而不会陷入“为什么不这么做X”的问题。

  • runtimes/{rid}/lib/{tfm}/*.dll路径看行
  • target="lib/{tfm}/..."程序集是自动引用的,runtimes/...不是
  • 使用目标框架netstandard似乎可以使您的包在项目netcoreappnetstandard项目中都能正常工作(例如use target="lib/netstandard1.6/...")。与此比较
  • runtimes/似乎适用于您将在运行时加载的平台相关程序集。例如,在runtimes/win-x64/native/和中runtimes/win-x86/native/加载了32/64位本机程序集AssemblyLoadContextMcMaster的另一篇文章
  • 为Windows和OSX使用单独的slns,或引用与平台无关的项目的单独的特定于平台的项目(例如Xamarin),将避免某些配置问题
  • 在上没有找到任何文档target="ref/...",但是您可以添加Explicit Assembly<references>(在nuspec <metadata>块内)
  • 打包的程序集不会出现在输出目录中,但是当准备分发时,dotnet publish它们将包括在内:


Ova*_*one 5

.NET Core 和 .NETSTANDARD 不会将依赖项复制到输出目录,它们使用 deps.json 映射,指向本地 NuGet 缓存的相对路径。