代码之家  ›  专栏  ›  技术社区  ›  Brad Robinson

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

  •  12
  • Brad Robinson  · 技术社区  · 6 年前

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

    1. net461 在Windows和
    2. netcoreapp2.0

    我想知道如何正确地为NuGet打包这个。根据 this post 我应该可以这样包装它们:

    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    

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

    然后我在某个地方读到,你还需要在 /ref 所以我尝试了这个:

    /runtimes/win/lib/net461/myassembly.dll
    /runtimes/osx/lib/netcoreapp2.0/myassembly.dll
    /ref/net461/myassembly.dll
    /ref/netcoreapp2.0/myassembly.dll
    

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

    关于这一切的文件非常模糊,我相当迷茫。

    我错过了什么?


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


    更新:我已经整理了一个 sample project 这说明了我正在努力实现的目标。具体请参见自述文件的底部,标题为“NuGet Packaging”。

    6 回复  |  直到 6 年前
        1
  •  17
  •   Brad Robinson    6 年前

    这就是我最终发现/猜测的(因为据我所知,其中一些还没有官方文档)

    • 添加到/runtimes文件夹的文件不会自动添加为对目标项目的引用。
    • /ref和/runtime文件夹应该相互结合使用,并且只能用于.NET核心目标。尽我所能.NETFramework目标显然不支持这些文件夹。
    • /ref文件夹用于编译时引用,此处添加的任何内容都将作为对目标项目的引用添加。
    • 我已经读过(但还没有自己测试过)/ref文件夹中的程序集必须是“anycpu”版本。如果需要,可以使用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)
    
        2
  •  9
  •   Jake    6 年前

    我花了大量时间在visualstudioformac和VS代码中尝试您在OSX上的项目。我会尽量坚持事实上的观察,而不是“你为什么不做X呢”。

    • runtimes/{rid}/lib/{tfm}/*.dll 路径看起来不错
    • target="lib/{tfm}/..." 程序集被自动引用, runtimes/... 不是
    • 使用目标框架 netstandard 似乎这会让你的包在两个方面都起作用 netcoreapp 项目(如使用 target="lib/netstandard1.6/..." ). 比较 with this
    • runtimes/ 似乎适用于运行时加载的平台相关程序集。例如,中的32/64位本机程序集 runtimes/win-x64/native/ runtimes/win-x86/native/ )装载 AssemblyLoadContext ( another post by McMaster )
    • 为Windows和OSX使用单独的sln,或者使用单独的平台特定项目来引用与平台无关的项目(例如 Xamarin
    • target="ref/..." Explicit Assembly <references> (nuspec内部) <metadata> (块)
    • dotnet publish 包括:
        3
  •  5
  •   Ovan Crone    6 年前

        4
  •  0
  •   koelkastfilosoof    6 年前

    是否可以尝试将.NET Standard 2.0作为目标,而不是net461和netcoreapp2.0?基于netstandard2.0构建的库应与.NET Core 2.0和.NET Framework 4.6.1配合使用: https://docs.microsoft.com/en-us/dotnet/standard/net-standard

        5
  •  0
  •   kimbirkelund    6 年前

    dotnet pack 针对包含以下内容的.csproj文件:

    <Project Sdk="Microsoft.NET.Sdk">    
      <PropertyGroup>
        <TargetFrameworks>net461;netcoreapp2.1;netstandard2.0</TargetFrameworks>
      </PropertyGroup>    
    </Project>
    

    将生成适用于.NET Framework 4.6.1、.NET Core 2.1和.NET Standard 2.0的.nupkg。

    然后可以使用各种技巧为每个框架包含特定的部分,具体取决于可用的部分。

        6
  •  0
  •   Владимир    6 年前

    我也在努力解决同样的问题。 Win和net46的情况很清楚。现在我需要为Win和Linux的netcoreapp项目中的程序集添加一个引用。问题是这是一个同名的不同程序集。我的包裹看起来像这样:

    /lib/net461/myassembly1.dll                       (net461/Windows Compile and Runtime)
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll   (netcore/Ubuntu Runtime)
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll   (netcore/Win Runtime)
    /ref/netcoreapp2.0/???
    

    此版本在两个系统上都适用

    /lib/net461/myassembly1.dll   
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll 
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll  
    /ref/netcoreapp2.0/myassembly1.dll
    

    还有这个

    /lib/net461/myassembly1.dll   
    /runtimes/ubuntu/lib/netcoreapp2.0/myassembly2.dll 
    /runtimes/win/lib/netcoreapp2.0/myassembly1.dll  
    /ref/netcoreapp2.0/myassembly2.dll
    

    推荐文章