当NuGet包具有Grpc.Core作为依赖项时,二进制文件被添加到项目中

时间:2017-01-30 17:10:36

标签: .net visual-studio nuget grpc

我遇到了一个有趣的问题,它可能是我目前还不知道的关于NuGet的东西,但我正在创建一个NuGet包,我称之为 Project Alpha ,它有一个对Grpc的依赖,在扩展中,它依赖于有问题的包:Grpc.Core

Grpc.Core,通过Grpc Project Alpha 中安装正常,并且不会向 Project Alpha 的项目添加新文件。另一方面,项目测试版依赖于项目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文件引用它们并明确表示要复制到输出目录。应该注意,它将通过将这些文件复制到输出目录来正确构建。

更多参考:

Project 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文件,但我不确定是什么原因导致了这个问题。理想情况下,我想要一个解决方案不仅仅是“为什么不在构建文件后立即删除文件?”。如果最终成为唯一的解决方案,那么我会这样做;但是,我不认为这是一个真正的解决方案。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

我仍然不知道为什么它在这种情况下比.nuspec排除属性更有效,但我很高兴它已经解决了!

答案 1 :(得分:0)

在打包直接安装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个二进制文件添加到我的项目中。