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

如何修改MSBuild .targets文件仅复制输出目录不存在的文件

解决NuGet包.targets文件覆盖已存在文件的问题

要实现仅复制输出目录中不存在的文件(仅依据文件名,不比较文件大小或修改日期),可以通过以下两种MSBuild配置方案修改你的.targets文件:

方案一:在Copy任务中直接添加存在性判断

修改原<Target>节点,为每个源文件添加条件判断,仅当目标目录无同名文件时执行复制:

<ItemGroup>
  <Files Include="$(MSBuildThisFileDirectory)/../contentFiles/Dependencies/*.*" />
</ItemGroup>
<Target Name="CopyDependencies" AfterTargets="Build">
  <Copy SourceFiles="@(Files)" 
        DestinationFolder="$(TargetDir)"
        Condition="!Exists('$(TargetDir)%(Filename)%(Extension)')" />
</Target>

说明

  • %(Filename)和%(Extension)是MSBuild内置元数据,分别提取源文件的文件名和扩展名
  • !Exists(...)判断目标路径下是否不存在同名文件,条件成立时才复制当前文件

方案二:提前筛选需复制的文件集合

先通过ItemGroup筛选出目标目录不存在的文件,再对筛选后的集合执行复制:

<ItemGroup>
  <Files Include="$(MSBuildThisFileDirectory)/../contentFiles/Dependencies/*.*" />
  <!-- 仅保留目标目录中没有的文件 -->
  <FilesToCopy Include="@(Files)" Condition="!Exists('$(TargetDir)%(Filename)%(Extension)')" />
</ItemGroup>
<Target Name="CopyDependencies" AfterTargets="Build">
  <Copy SourceFiles="@(FilesToCopy)" 
        DestinationFolder="$(TargetDir)" />
</Target>

说明

  • 新增的<FilesToCopy>集合自动过滤掉已存在于目标目录的文件
  • 后续仅对这个过滤后的集合执行复制,避免了不必要的重复判断

两种方案均可实现需求,可根据个人习惯选择使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:50:25