多目标项目中如何用BuildOutputInPackage将文件夹复制到NuGet包
解决多目标项目中复制文件夹到NuGet包指定目录的问题
问题出在你设置的<TargetPath>没有保留源文件夹内的文件层级结构:当直接指定<TargetPath>Example</TargetPath>时,所有文件都会被映射到同一个目标路径,MSBuild会认为后续文件要覆盖已存在的路径,因此只保留第一个文件并抛出警告。
你可以通过以下两种方式修改配置,实现将整个Example文件夹内容完整复制到NuGet包对应目标框架下的Example目录:
方法一:使用相对路径计算
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;net48</TargetFrameworks> </PropertyGroup> <PropertyGroup> <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);Example</TargetsForTfmSpecificBuildOutput> </PropertyGroup> <Target Name="Example"> <ItemGroup> <!-- 先收集所有源文件 --> <ExampleFiles Include="$(ProjectDir)Example\**\*.*" /> <!-- 为每个文件计算相对路径,拼接到目标目录后 --> <BuildOutputInPackage Include="@(ExampleFiles)"> <TargetPath>Example\$([System.IO.Path]::GetRelativePath($(ProjectDir)Example, %(FullPath)))</TargetPath> </BuildOutputInPackage> </ItemGroup> </Target> </Project>
方法二:使用MSBuild递归目录变量
这种方式更简洁,直接利用%(RecursiveDir)变量保留源文件的目录结构:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;net48</TargetFrameworks> </PropertyGroup> <PropertyGroup> <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);Example</TargetsForTfmSpecificBuildOutput> </PropertyGroup> <Target Name="Example"> <ItemGroup> <BuildOutputInPackage Include="$(ProjectDir)Example\**\*.*"> <TargetPath>Example\%(RecursiveDir)</TargetPath> </BuildOutputInPackage> </ItemGroup> </Target> </Project>
修改完成后重新打包,打开NuGet包(可将后缀改为.zip查看内部结构),对应目标框架(如netstandard2.0、net48)目录下的Example文件夹会完整包含源文件夹内的所有文件及层级结构。
内容的提问来源于stack exchange,提问作者Red Riding Hood
相关产品推荐
相关产品推荐

