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.txt
和 TextFile2.txt
复制到主项目的输出文件夹中的相同文件夹结构中,您可以试试这个:
两个提示:
要将 nupkg
中的文件复制到主项目的输出文件夹中,您应该使用 <PackageCopyToOutput>true</PackageCopyToOutput>
.
使用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=下的所有文件].之后,重新安装新的发布版本。
我在 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.txt
和 TextFile2.txt
复制到主项目的输出文件夹中的相同文件夹结构中,您可以试试这个:
两个提示:
要将
nupkg
中的文件复制到主项目的输出文件夹中,您应该使用<PackageCopyToOutput>true</PackageCopyToOutput>
.使用
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=下的所有文件].之后,重新安装新的发布版本。