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

如何阻止ProjectB引用ProjectA时复制somefolder至输出目录(保留其他文件)

解决项目引用时选择性排除指定内容文件夹的问题

问题背景

我在ProjectA.csproj中配置了以下规则,确保somefolder下的所有文件会被复制到ProjectA自身的输出目录,这符合预期需求:

<None Include="somefolder\**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

但当我在ProjectB中引用ProjectA时,需要实现:

  • 不将somefolder复制到ProjectB的输出目录
  • 保留其他内容文件(如appsettings.json)向ProjectB输出目录的复制

尝试过以下方法但均无效:

  • 在ProjectA的CopyToOutputDirectory标签添加条件,使用ProjectB定义的SkipCopying属性
  • 在ProjectB中用<None Update="somefolder/**"><CopyToOutputDirectory>Never</CopyToOutputDirectory></None>覆盖规则
  • 设置<ProjectReference Include="..." Private="False" />——此方法虽排除了somefolder,但也导致其他内容文件无法复制

不想采用“先复制再删除”的方案(文件数量大,会显著增加构建时间),求可行替代方案。

可行解决方案

方案1:在ProjectA中标记somefolder为私有

修改ProjectA的csproj配置,给somefolder的文件添加<Private>True</Private>元数据,标记这些文件为项目私有,引用项目(如ProjectB)不会复制它们,但ProjectA自身构建时仍会正常复制:

<None Include="somefolder\**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Private>True</Private>
</None>

方案2:在ProjectB中精准过滤来自ProjectA的somefolder文件

如果无法修改ProjectA的配置,可在ProjectB的csproj中添加目标,在复制文件到输出目录前,移除来自ProjectA的somefolder相关文件:

<Target Name="ExcludeSomeFolderFromProjectA" BeforeTargets="CopyFilesToOutputDirectory">
  <ItemGroup>
    <!-- 替换为实际的ProjectA路径 -->
    <None Remove="**\somefolder\**" Condition="'%(OriginalProjectReference.Identity)' == '..\ProjectA\ProjectA.csproj'" />
  </ItemGroup>
</Target>

如果不需要限定仅排除ProjectA的somefolder,可简化为:

<Target Name="ExcludeSomeFolder" BeforeTargets="CopyFilesToOutputDirectory">
  <ItemGroup>
    <None Remove="**\somefolder\**" />
  </ItemGroup>
</Target>

注意事项

  • 方案1需确保ProjectA中其他需要被引用项目复制的内容文件未设置<Private>True</Private>
  • 方案2中的路径匹配需根据实际项目结构调整,确保能精准命中目标文件

内容的提问来源于stack exchange,提问作者gehho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:07:01