繁体   English   中英

为什么 NuGet 包中的内容文件作为链接添加到 .NET 核心项目中,您如何防止这种情况发生?

[英]Why are content files from NuGet packages added as links in .NET Core projects and how can you prevent that?

我正在开发一个 .NET 标准库,并计划在 .NET 核心和 .NET 框架项目中使用它。 我的库依赖于第三个库,该库本身依赖于一些 C 二进制文件。 必须将 C 二进制文件复制到将引用我的库的项目的 output 目录中。

我将二进制文件作为内容添加到我的库项目中,当 NuGet package 使用dotnet pack命令打包时,它们被复制到contentcontentFiles目录。 这些文件也列在nuspec文件中。


但是,当我安装 NuGet package 时,有两种不同的行为需要观察,具体取决于我将它安装到 .NET 框架还是 Z3031CB0EF9EDB59072DAZ6 核心项目:5EF9EDB9078282

.NET 框架

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

.NET芯

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


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

为什么在这种情况下 .NET 框架和 .NET 核心项目的行为不同,是否可以获得 .NET 框架项目在 Z303CB0EF59EDB9072DAZ6 核心项目中的行为?

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

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

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

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

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

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

脚步

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

在此处输入图像描述

注意:如果您的库 nuget 被称为lib.1.0.0.nupkg ,则道具文件应命名为lib.props文件,以便它可以工作。 它应该与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)将这些添加到 lib 项目的xxx.csproj文件中。

<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 package 时,它将二进制文件复制到名为Binary的文件夹中到您的主项目中。

Also, when you install this new version of nuget package, please clean your nuget caches or delete all files under C:\Users\xxx(current user)\.nuget\packages .

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

根据Perry Quan-MSFT回答,我将二进制文件复制到 output 目录而不是项目中。

我认为这比用不必要的文件弄乱一个项目更好。

这是我的props文件的样子:

<Project ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
  <ItemGroup>
    <Binaries Include="$(MSBuildThisFileDirectory)..\binaries\*.*" />
  </ItemGroup>

  <Target Name="CopyBinaries" BeforeTargets="Build">
    <Copy SourceFiles="@(Binaries)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
  </Target>
</Project>

Success that I'd like to share - Am using dotnetcore (.Net 6) I needed to share a c# class library as well as common json config files and created a library class project that includes content files and outputs a nuget package.

采用其他好的答案 - 这是在合并其他建议后对我有用的方法。

在“lib”项目中 - 包括 build\lib.props 文件。 内容:

<Project>
    <Target Name="CopyFiles" BeforeTargets="Build">
        <ItemGroup>
            <ConfigFilesShared Include="$(MSBuildThisFileDirectory)..\SharedConfig\*.*" />
        </ItemGroup>
        <Copy SourceFiles="@(ConfigFilesShared)" DestinationFolder="$(ProjectDir)SharedConfig" SkipUnchangedFiles="false"></Copy>
    </Target>
</Project>

以上在构建之前将文件复制到使用项目的文件夹中。

在 lib.csproj 文件中还包括以下内容:

<ItemGroup>
    <Content Include="Config\*" Pack="true" PackagePath="SharedConfig\" />
    <None Include="Build\Roc.Shared.props" Pack="true" PackagePath="build"></None>
</ItemGroup>

在“消费”项目中 - 为了隐藏项目中的文件目录以免混淆,我的 csproj 中有以下内容正在使用共享库:

<ItemGroup>
    <Content Remove="SharedConfig\**" />
    <None Remove="SharedConfig\**" />
</ItemGroup>

为确保文件包含在 Output(常规构建)和发布中,使用以下代码。

<!-- For Build - Move the shared library shared config files that were previously copied to the SharedConfig folder-->
<Target Name="PrebuildScriptShared" BeforeTargets="Build">
    <ItemGroup>
        <ConfigFiles1 Include="SharedConfig\**" />
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFiles1)" DestinationFolder="$(OutDir)Config" SkipUnchangedFiles="false" />
</Target>
<!-- For Publish - Move the shared library shared config files that were previously copied to the SharedConfig folder-->
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
    <ItemGroup>
        <ConfigFiles2 Include="SharedConfig\**" />
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFiles2)" DestinationFolder="$(PublishDir)Config" SkipUnchangedFiles="false" />
</Target>

,您现在拥有从 nuget package 复制到您的消费项目的内容文件,并在构建期间使用。 调试和发布::)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM