.net - 为什么将 NuGet 包中的内容文件作为链接添加到 .NET Core 项目中,如何防止这种情况发生?
问题描述
我正在开发一个 .NET Standard 库,并计划在 .NET Core 和 .NET Framework 项目中使用它。我的库依赖于第三个库,该库本身依赖于一些 C 二进制文件。必须将 C 二进制文件复制到将引用我的库的项目的输出目录。
我将二进制文件作为内容添加到我的库项目中,当 NuGet 包与命令一起打包时,它们被复制到content
和目录。这些文件也列在文件中。contentFiles
dotnet pack
nuspec
但是,当我安装 NuGet 包时,需要观察两种不同的行为,具体取决于我将其安装到 .NET Framework 还是 .NET Core 项目:
.NET 框架
我添加到库项目中的二进制文件也添加到了引用项目中,我可以将它们复制到输出目录。这是我期望、想要并且有效的行为。
.NET 核心
我添加到我的库项目中的二进制文件也添加到了引用项目中,但作为链接也可以使用,但当然只能在我的机器上使用,因为 NuGet 包默认存储在 Windows 用户文件夹中。这会给将在不同机器上处理同一项目的其他任何人带来问题,因为在这种情况下,文件的链接会被破坏。
我已经尝试过处理nuspec
文件本身,但这并没有真正的帮助,因为我只是nuspec
在打包后才得到文件,这是由 CI 管道完成的。
为什么在这种情况下 .NET Framework 和 .NET Core 项目的行为不同,是否可以在 .NET Core 项目中获取 .NET Framework 项目的行为?
解决方案
实际上,这是正常的行为。
你看到的 content 和 contentFiles 的行为是正常的,它们的规则是由微软设计的。
内容节点会将其内容作为真实文件打包到主项目中。这适用于具有packages.config nuget 管理格式的 Net Framework 项目。
同时,ContentFiles节点会将其内容以链接格式打包到主项目(Net Core和Net Standard项目)中。这适用于PackageReference nuget 管理格式。
因此,如果您希望此功能与Net Core上的Net Framework项目相同,则应在网络标准项目上使用<package_id>.props来获得您想要的。
脚步
1)在您的网络标准库项目的文件夹下创建一个名为<packages_id>.props
file 的文件。build
注意:如果你的 lib nuget 被调用lib.1.0.0.nupkg
,props 文件应该被命名为lib.props
file 以便它可以工作。它应该与nuget_id
.
2)将这些添加到lib.props
文件中:
<Project>
<Target Name="CopyFiles" BeforeTargets="Build">
<ItemGroup>
<File Include="$(MSBuildThisFileDirectory)..\Binary\*.*"></File>
</ItemGroup>
<Copy SourceFiles="@(File)" DestinationFolder="$(ProjectDir)Binary"></Copy>
</Target>
</Project>
3)将这些添加xxx.csproj
到lib项目的文件中。
<ItemGroup>
<None Include="xxx\**.**"(all the binary files) Pack="true" PackagePath="Binary"></None>
<None Include="build\lib.props" Pack="true" PackagePath="build"></None>
</ItemGroup>
4)当你安装这个新版本的 nuget 包时,它将二进制文件复制到一个名为Binary的文件夹到你的主项目中。
此外,当您安装此新版本的 nuget 包时,请清理您的 nuget 缓存或删除C:\Users\xxx(current user)\.nuget\packages
.
此外,关于步骤也有类似的问题。
推荐阅读
- crystal-reports - Crystal Reports:如何在生效日期后从字段中获取以前的记录?请看例子
- json - Firebase 工具:如何在使用大 JSON 文件设置数据库时避免“内存不足”错误?如何通过 firebase-tools 流式传输 JSON?
- sql - 当表在 SQL Server 中没有行时如何打印 NULL?
- python-3.x - AttributeError:模块“tensorflow.compat.v2”没有属性“__internal__”
- python - 未在 AlienInvasion 程序中定义自我?
- testing - 如何在编写时测试带有输出的 Solidity 代码?
- php - 无法更新图像,但可以更新详细信息
- visual-studio-code - 使用 Svelte 使用 webviews 进行 VSCode 扩展开发挂起进程
- python - 实现多变量和多维数据聚类分析的k-means算法
- database - 询问数据库管理员密码以便在 Odoo 12 中执行某些操作