我遇到了一个有趣的问题,它可能是我目前还不知道的关于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
文件,但我不确定是什么原因导致了这个问题。理想情况下,我想要一个解决方案不仅仅是“为什么不在构建文件后立即删除文件?”。如果最终成为唯一的解决方案,那么我会这样做;但是,我不认为这是一个真正的解决方案。
有什么想法吗?建议?黑客?
答案 0 :(得分:4)
我找到了解决这个问题的方法。我曾尝试使用.nuspec
并排除二进制文件,但这不起作用,我实际上只是在安装NuGet包时遇到了问题。
我发现的最佳方法(因为它适用于我)是使用我之前错过的nuget pack
命令行参数,即-Exclude
。
所以我用来打包.csproj
的最后一个命令是
nuget pack ProjectAlpha.csproj -Exclude **\*.x86.*;**\*.x64.*
如果解决方案不明确,nuget pack
将打包输出目录(bin\Debug
或bin\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个二进制文件添加到我的项目中。