【问题标题】:NuGet doesn't treat CopyToOutputDirectory correctly with linked fileNuGet 没有正确处理带有链接文件的 CopyToOutputDirectory
【发布时间】:2021-07-07 14:36:37
【问题描述】:

我在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 中,并且根文件夹中没有文本文件,因为根文件夹中的文件没有标记为&lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt;,但链接是。

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


    【解决方案1】:

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

    两个提示:

    1. 要将来自nupkg 的文件复制到主项目的输出文件夹中,您应该使用&lt;PackageCopyToOutput&gt;true&lt;/PackageCopyToOutput&gt;

    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或者干脆删除C:\Users\xxx\.nuget\packages下的所有文件。之后,重新安装新的发布版本。

    【讨论】:

    • 非常感谢。在@Andy的回答之后才注意到,当我使用nuget包时文件没有输出,所以我实际上有两个问题文件没有输出,文件夹结构不是我喜欢的。所以,我从你的回答中读到的两个问题都得到了解决,我不必手动更改 *.nuspec 文件,明天会尝试并报告,但似乎很有帮助。你知道我在哪里可以找到PackageCopyToOutput 之类的文档吗,这不是我第一次想更改我的 nuget 包但没有这样做,而唯一的方法是手动编辑 nuspec 文件?跨度>
    • 这太棒了——我从来不知道&lt;PackageCopyToOutput&gt; 这会自动添加我的答案中的copyToOutput="true" 属性。多年来,这一直让我发疯。
    • this document。它是 contentFiles 节点的特性。它应该是像/contentFiles/{codeLanguage}/{TxM}/{any?} 这样的结构。第一个any是文件类型:像cs,vb,any是通用的,表示它可以处理所有类型。第二个any是targetframework,any表示所有targetframework都可以安装以下内容文件。所以使用any\any 是最简单的方法。此外,您不能在打包过程中使用targetframework 与多个目标框架。
    • 我发现这是个问题,您应该向the team 报告。在额外的打包过程中,它总是空的。为避免这种情况,请使用any\any。或者您应该一一指定它们。使用any\net47any\net5.0。最类似的问题,如this similar issue。在打包过程中,您应该避免在多个目标框架下使用targetframework
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多