首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当NuGet包将Grpc.Core作为依赖项时,二进制文件将添加到项目中。

当NuGet包将Grpc.Core作为依赖项时,二进制文件将添加到项目中。
EN

Stack Overflow用户
提问于 2017-01-30 17:10:35
回答 3查看 4.9K关注 0票数 7

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

Grpc.Core,通过Grpc在project中安装良好,并且不向Project的项目添加新的文件。而项目Beta则依赖于Project,以及扩展Grpc.Core。当我安装Project时,Grpc.Core的安装会导致项目Beta中的以下项目树

代码语言:javascript
运行
复制
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个二进制文件,我不希望它们包含在项目中,或者安装在项目根目录中。

在查看Grpc.Core.nupkg之后,我发现这6个二进制文件来自一个runtimes文件夹;然而,只有一个.targets文件引用它们并明确要求复制到输出目录。应该指出,它将通过将这些文件复制到输出目录来正确构建。

如需更多参考:

项目α依赖树

代码语言:javascript
运行
复制
Project Alpha
|- Grpc
|  |- Grpc.Core
|- Google.Protobuf

运行nuget pack ProjectAlpha.csproj -Properties Configuration=Release后的以下nupkg结果

代码语言:javascript
运行
复制
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文件了,但我不确定是什么导致了这个问题。理想情况下,我希望有一个解决方案,不只是“为什么不直接删除文件,因为它的构建?”如果这是唯一的解决方案,那么我会这么做;然而,我不认为这是一个真正的解决方案。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-01 15:20:33

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

我发现的最好的方法(因为它对我有用)是为nuget pack使用命令行参数,这是我之前忽略的,也就是-Exclude

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

代码语言:javascript
运行
复制
nuget pack ProjectAlpha.csproj -Exclude **\*.x86.*;**\*.x64.*

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

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

票数 5
EN

Stack Overflow用户

发布于 2017-01-31 06:24:19

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

因此,我为nuget包项目创建了一个.nuspec文件,然后按如下方式修改.nuspec文件,该文件只包含包基本信息和依赖项信息。

代码语言:javascript
运行
复制
<?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个二进制文件添加到我的项目中。

票数 0
EN

Stack Overflow用户

发布于 2021-11-30 11:00:46

我自己也遇到了这个问题,并努力找到一个令人满意的解决办法。

我希望尽可能地将包生成保留在csproj文件中,但是跳过从包中包含本机库。

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

代码语言:javascript
运行
复制
<PackageReference Include="Grpc.Core" Version="2.33.1">
  <IncludeAssets>compile; build</IncludeAssets>
  <ExcludeAssets>runtime; native; contentfiles; analyzers; buildtransitive</ExcludeAssets>
</PackageReference>

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

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

赢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41941588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档