当 NuGet 包具有 Grpc.Core 作为依赖项时,二进制文件将添加到项目中
Binaries are added to project when NuGet package has Grpc.Core as a dependency
我遇到了一个有趣的问题,这可能是我目前对 NuGet 不了解的问题,但我正在创建一个 NuGet 包,我将其称为 Project Alpha,它依赖于 Grpc
,在扩展中,它依赖于有问题的包:Grpc.Core
.
Grpc.Core
,通过 Grpc
在 Alpha 项目 中安装正常,并且不会向 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
文件,但我不确定是什么导致了这个问题地方。理想情况下,我希望有一个不仅仅是 "Why don't you just delete the files since it builds?" 的解决方案。如果这最终成为唯一的解决方案,那么我会这样做;但是,我认为这不是真正的解决方案。
有什么想法吗?建议?黑客?
我在打包直接安装 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 个二进制文件添加到我的项目中。
我找到了解决这个问题的方法。我曾尝试使用 .nuspec
并排除二进制文件,但这没有用,实际上我在安装 NuGet 包时遇到了问题。
我发现的最佳方法(因为它对我有用)是使用我之前错过的 nuget pack
的 command-line 参数,即 -Exclude
.
所以我用来打包.csproj
的最后一个命令是
nuget pack ProjectAlpha.csproj -Exclude **\*.x86.*;**\*.x64.*
如果解决方案不清楚,nuget pack
将打包在输出目录(bin\Debug
或 bin\Release
)中找到的所有内容,并且出现问题是因为有 6 个二进制文件NuGet 不知道来源。我知道它们是通过 Grpc.Core
的 NuGet 包中的 .targets
文件复制的。因此,需要将它们排除在外,因为 .targets
文件会在包含 Grpc.Core
的任何后续项目中正确复制它们。因此,-Exclude
起作用了。
我仍然不知道为什么它在这种情况下比 .nuspec
排除属性更好,但我很高兴它已经解决了!
我自己也遇到过这个问题,苦苦寻找满意的解决方案
我想尽量将包生成保留在 csproj
文件中,但跳过包含包中的本机库。
我的诀窍是为 PackageReference
标签设置额外的选项,像这样:
<PackageReference Include="Grpc.Core" Version="2.33.1">
<IncludeAssets>compile; build</IncludeAssets>
<ExcludeAssets>runtime; native; contentfiles; analyzers; buildtransitive</ExcludeAssets>
</PackageReference>
基本上,我们希望保留 compile
和 build
资产,因为它们将允许项目编译,但我们希望排除其他所有内容(尤其是 runtime
和 native
,它们是包中的主要违规者)。
这产生了一个 ~100KB .nupkg
文件而不是 ~135MB,同时保留了对 Grpc.Core
包的依赖。
赢了!
我遇到了一个有趣的问题,这可能是我目前对 NuGet 不了解的问题,但我正在创建一个 NuGet 包,我将其称为 Project Alpha,它依赖于 Grpc
,在扩展中,它依赖于有问题的包:Grpc.Core
.
Grpc.Core
,通过 Grpc
在 Alpha 项目 中安装正常,并且不会向 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
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
文件,但我不确定是什么导致了这个问题地方。理想情况下,我希望有一个不仅仅是 "Why don't you just delete the files since it builds?" 的解决方案。如果这最终成为唯一的解决方案,那么我会这样做;但是,我认为这不是真正的解决方案。
有什么想法吗?建议?黑客?
我在打包直接安装 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 个二进制文件添加到我的项目中。
我找到了解决这个问题的方法。我曾尝试使用 .nuspec
并排除二进制文件,但这没有用,实际上我在安装 NuGet 包时遇到了问题。
我发现的最佳方法(因为它对我有用)是使用我之前错过的 nuget pack
的 command-line 参数,即 -Exclude
.
所以我用来打包.csproj
的最后一个命令是
nuget pack ProjectAlpha.csproj -Exclude **\*.x86.*;**\*.x64.*
如果解决方案不清楚,nuget pack
将打包在输出目录(bin\Debug
或 bin\Release
)中找到的所有内容,并且出现问题是因为有 6 个二进制文件NuGet 不知道来源。我知道它们是通过 Grpc.Core
的 NuGet 包中的 .targets
文件复制的。因此,需要将它们排除在外,因为 .targets
文件会在包含 Grpc.Core
的任何后续项目中正确复制它们。因此,-Exclude
起作用了。
我仍然不知道为什么它在这种情况下比 .nuspec
排除属性更好,但我很高兴它已经解决了!
我自己也遇到过这个问题,苦苦寻找满意的解决方案
我想尽量将包生成保留在 csproj
文件中,但跳过包含包中的本机库。
我的诀窍是为 PackageReference
标签设置额外的选项,像这样:
<PackageReference Include="Grpc.Core" Version="2.33.1">
<IncludeAssets>compile; build</IncludeAssets>
<ExcludeAssets>runtime; native; contentfiles; analyzers; buildtransitive</ExcludeAssets>
</PackageReference>
基本上,我们希望保留 compile
和 build
资产,因为它们将允许项目编译,但我们希望排除其他所有内容(尤其是 runtime
和 native
,它们是包中的主要违规者)。
这产生了一个 ~100KB .nupkg
文件而不是 ~135MB,同时保留了对 Grpc.Core
包的依赖。
赢了!