首页 > 解决方案 > NuGet 没有正确处理带有链接文件的 CopyToOutputDirectory

问题描述

我在我的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 结构 在此处输入图像描述 在此处输入图像描述

如您所见,两个文件都在 subdirectoryFiles中,并且根文件夹中没有文本文件,因为根文件夹中的文件未标记为,<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>但链接是。

现在我想打包这个应用程序,它不尊重我的文件链接并将其转储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>

标签: c#visual-studionugetcsproj

解决方案


如果您只想将 nuget 包中的TextFile1.txtandTextFile2.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 包,清理 nuget 缓存或删除所有C:\Users\xxx\.nuget\packages. 之后,重新安装新的发布版本。


推荐阅读