如何阻止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
相关产品推荐
相关产品推荐

