首页 > 解决方案 > 为什么将 NuGet 包中的内容文件作为链接添加到 .NET Core 项目中,如何防止这种情况发生?

问题描述

我正在开发一个 .NET Standard 库,并计划在 .NET Core 和 .NET Framework 项目中使用它。我的库依赖于第三个库,该库本身依赖于一些 C 二进制文件。必须将 C 二进制文件复制到将引用我的库的项目的输出目录。

我将二进制文件作为内容添加到我的库项目中,当 NuGet 包与命令一起打包时,它们被复制到content和目录。这些文件也列在文件中。contentFilesdotnet packnuspec


但是,当我安装 NuGet 包时,需要观察两种不同的行为,具体取决于我将其安装到 .NET Framework 还是 .NET Core 项目:

.NET 框架

我添加到库项目中的二进制文件也添加到了引用项目中,我可以将它们复制到输出目录。这是我期望、想要并且有效的行为。

.NET 核心

我添加到我的库项目中的二进制文件也添加到了引用项目中,但作为链接也可以使用,但当然只能在我的机器上使用,因为 NuGet 包默认存储在 Windows 用户文件夹中。这会给将在不同机器上处理同一项目的其他任何人带来问题,因为在这种情况下,文件的链接会被破坏。


我已经尝试过处理nuspec文件本身,但这并没有真正的帮助,因为我只是nuspec在打包后才得到文件,这是由 CI 管道完成的。

为什么在这种情况下 .NET Framework 和 .NET Core 项目的行为不同,是否可以在 .NET Core 项目中获取 .NET Framework 项目的行为?

标签: .netvisual-studio.net-corenugetnuget-package

解决方案


实际上,这是正常的行为。

你看到的 content 和 contentFiles 的行为是正常的,它们的规则是由微软设计的。

请参考这个类似的问题这个

内容节点会将其内容作为真实文件打包到主项目中。这适用于具有packages.config nuget 管理格式的 Net Framework 项目。

同时,ContentFiles节点会将其内容以链接格式打包到主项目(Net CoreNet Standard项目)中。这适用于PackageReference nuget 管理格式。

因此,如果您希望此功能与Net Core上的Net Framework项目相同,则应在网络标准项目上使用<package_id>.props来获得您想要的。

脚步

1)在您的网络标准库项目的文件夹下创建一个名为<packages_id>.propsfile 的文件。build

在此处输入图像描述

注意:如果你的 lib nuget 被调用lib.1.0.0.nupkg,props 文件应该被命名为lib.propsfile 以便它可以工作。它应该与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.

此外关于步骤也有类似的问题


推荐阅读