NuGet 没有正确处理链接文件的 CopyToOutputDirectory

NuGet doesn't treat CopyToOutputDirectory correctly with linked file

我在 csproj 中声明了以下内容。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="TextFile1.txt" Link="Files\TextFile1.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Files\TextFile2.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

</Project>

构建应用程序后,我得到以下 bin/debug 结构

如您所见,两个文件都在子目录 Files 中,根文件夹中没有文本文件,因为根文件夹中的文件未标记为 <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>,但link 是。

现在我想打包这个应用程序,它不符合我对文件的 linking 并将 TextFile1.txt 转储到根文件夹中。

创建的 *.nuspec 文件如下所示

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>ConsoleApp44</id>
    <version>1.0.0</version>
    <authors>ConsoleApp44</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <dependencies>
      <group targetFramework="net5.0" />
    </dependencies>
    <contentFiles>
      <files include="any/net5.0/TextFile1.txt" buildAction="Content" />
      <files include="any/net5.0/Files/TextFile2.txt" buildAction="Content" />
    </contentFiles>
  </metadata>
</package>

如果您只想将 nuget 包中的 TextFile1.txtTextFile2.txt 复制到主项目的输出文件夹中的相同文件夹结构中,您可以试试这个:

两个提示:

  1. 要将 nupkg 中的文件复制到主项目的输出文件夹中,您应该使用 <PackageCopyToOutput>true</PackageCopyToOutput>.

  2. 使用PackagePath指定文件夹结构

ConsoleApp44.csproj 文件下使用此部分:

<ItemGroup>
        <Content Include="TextFile1.txt">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
            <Link>Files\TextFile1.txt</Link>
            <PackagePath>content\Files;contentFiles\any\any\Files</PackagePath>
            <PackageCopyToOutput>true</PackageCopyToOutput>
        </Content>
        <Content Include="TextFile2.txt">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
            <Link>Files\TextFile2.txt</Link>
            <PackagePath>content\Files;contentFiles\any\any\Files</PackagePath>
            <PackageCopyToOutput>true</PackageCopyToOutput>
        </Content>
    </ItemGroup>

实际上PackagePath是在安装nuget包时,将自定义输出文件夹结构指定到主工程中。您可以根据需要更改结构。

然后,你应该重新打包lib项目,卸载旧版本的nuget包,clean nuget caches或者直接删除[=18=下的所有文件].之后,重新安装新的发布版本。