【问题标题】:Binaries are added to project when NuGet package has Grpc.Core as a dependency当 NuGet 包将 Grpc.Core 作为依赖项时,会将二进制文件添加到项目中
【发布时间】:2017-06-15 22:41:47
【问题描述】:

我遇到了一个有趣的问题,它可能是我目前对 NuGet 不了解的事情,但我正在创建一个 NuGet 包,我将其称为 Project Alpha,它有一个对Grpc 的依赖,扩展后,它依赖于有问题的包:Grpc.Core

Grpc.Core,通过 GrpcProject Alpha 中安装良好,并且没有向 Project Alpha 的项目添加新文件。另一方面,Project Beta 依赖于 Project Alpha,并扩展为 Grpc.Core。当我安装 Project Alpha 时,Grpc.Core 的安装会导致 Project Beta

中出现以下项目树
ProjectBeta
|- Properties/
|- References/
|- App.config
|- grpc_csharp_ext.x64.dll
|- grpc_csharp_ext.x86.dll
|- libgrpc_csharp_ext.x64.dylib
|- libgrpc_csharp_ext.x64.so
|- libgrpc_csharp_ext.x86.dylib
|- libgrpc_csharp_ext.x86.so
|- packages.config
|- Program.cs

您会注意到它安装了 6 个我不希望 1) 包含在项目中或 2) 在项目根目录中的二进制文件。

查看Grpc.Core.nupkg后发现这6个二进制文件来自一个runtimes文件夹;但是,只有.targets 文件引用了它们并明确表示要复制到输出目录。需要注意的是,通过将这些文件复制到输出目录,它将正确构建。

更多参考:

项目 Alpha 依赖树

Project Alpha
|- Grpc
|  |- Grpc.Core
|- Google.Protobuf

运行nuget pack ProjectAlpha.csproj -Properties Configuration=Release后产生以下nupkg

content
|- grpc_csharp_ext.x64.dll
|- grpc_csharp_ext.x86.dll
|- libgrpc_csharp_ext.x64.dylib
|- libgrpc_csharp_ext.x64.so
|- libgrpc_csharp_ext.x86.dylib
|- libgrpc_csharp_ext.x86.so
lib
|- net452
   |- ProjectAlpha.dll

最终,我似乎需要弄清楚如何处理这些二进制文件,以便它们不再被打包为content 文件,但我不确定首先是什么导致了这个问题。理想情况下,我希望有一个解决方案,而不仅仅是“为什么不删除文件,因为它构建了?”。如果这最终成为唯一的解决方案,那么我会这样做;但是,我认为这不是一个真正的解决方案。

有什么想法吗?建议?黑客?

【问题讨论】:

  • 为什么会有 .targets 文件?目的是什么;只复制文件?您应该创建 2 个包;一个用于 x64,一个用于 x86。
  • 这不是我的包裹。我的包中没有.targets 文件;它位于Grpc.Core,我无法控制。 .targets 文件的目的似乎是将适当的二进制文件复制到输出目录。我认为您对 x86 与 x64 的担忧没有任何相关性。
  • 这里是来自实际 .targets 文件的 sn-p,以防这对某人很重要 <Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win\native\grpc_csharp_ext.x86.dll"><CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <Link>grpc_csharp_ext.x86.dll</Link> </Content>

标签: .net visual-studio nuget grpc


【解决方案1】:

我找到了解决这个问题的方法。我曾尝试使用 .nuspec 并排除二进制文件,但这不起作用,实际上我在安装 NuGet 包时遇到了问题。

我发现的最佳方法(因为它对我有用)是使用我之前错过的nuget pack 的命令行参数,即-Exclude

所以我用来打包.csproj的最后一个命令是

nuget pack ProjectAlpha.csproj -Exclude **\*.x86.*;**\*.x64.*

如果解决方案不明确,nuget pack 将打包在输出目录(bin\Debugbin\Release)中找到的所有内容,并且出现问题是因为 NuGet 不知道其中的 6 个二进制文件起源。我知道它们是通过Grpc.Core 的 NuGet 包中的.targets 文件复制的。因此,它们需要被排除,因为.targets 文件会在包含Grpc.Core 的任何后续项目中正确复制它们。因此,-Exclude 起作用了。

我仍然不知道为什么在这种情况下它比 .nuspec exclude 属性更好,但我很高兴它解决了!

【讨论】:

    【解决方案2】:

    打包直接安装 Grpc.Core 包的 .csproj 文件时遇到同样的问题。然后我检查 .nuspec 文件,我没有找到会导致内容文件添加到消费项目中的节点。

    所以我为我的 nuget 包项目创建了一个 .nuspec 文件,然后将 .nuspec 文件修改如下,它只包含包基本信息和依赖项信息。

    <?xml version="1.0"?>
    <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
      <metadata>
        <id>MyPackage</id>
        <version>1.0.0</version>
        <title>MyPackage</title>
        <authors>My Name</authors>
        <owners>My Name</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Description</description>
        <copyright>Copyright ?  2017</copyright>
        <dependencies>
          <dependency id="Grpc.Core" version="1.0.1" />
        </dependencies>
      </metadata>
    

    然后我将这个 .nuspec 文件打包成 .nupkg 文件并将这个包安装到另一个项目中。它不再将那 6 个二进制文件添加到我的项目中。

    【讨论】:

    • 我特别想打包.csproj 文件,因为我不想在.csproj.nuspec 中维护包含文件的列表。如果不可能做到这一点,那么这可能就是我不得不求助的方法。
    • 你知道为什么.csproj.nuspec的打包方式会有区别吗?
    • 在打包.csproj的时候,会自动打包所有的项目依赖文件,不管这些文件是否会被使用。而 .nuspec 文件可以帮助我们将需要的文件添加到包中,这更加明确。
    • 我尝试使用.nuspec 方法并在安装包时收到错误:Failed to add reference to 'grpc_csharp_ext.x64'。我拥有的 2 个依赖项是 Grpc@1.0.1Google.Protobuf@3.1.0
    【解决方案3】:

    我自己也遇到过这个问题,一直在努力寻找一个满意的解决方案。

    我想尽量将包生成保留在 csproj 文件中,但跳过包含包中的本机库。

    对我来说,诀窍是为PackageReference 标签设置其他选项,如下所示:

    <PackageReference Include="Grpc.Core" Version="2.33.1">
      <IncludeAssets>compile; build</IncludeAssets>
      <ExcludeAssets>runtime; native; contentfiles; analyzers; buildtransitive</ExcludeAssets>
    </PackageReference>
    

    基本上,我们希望保留 compilebuild 资产,因为它们将允许项目编译,但我们希望排除其他所有内容(尤其是 runtimenative,它们是主要违规者包装内)。

    这产生了一个 ~100KB .nupkg 文件而不是 ~135MB,同时保留了对 Grpc.Core 包的依赖。

    赢了!

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2015-01-15
      • 2018-05-24
      • 1970-01-01
      相关资源
      最近更新 更多