You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多目标项目中如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:45:56