SuperAPI AI 工具集

copy-to-output-directory

通用与其它

查看项目

更新于 10-16 06:45

技能介绍

用途:控制 Content、None、EmbeddedResource、Compile 等项是否复制到构建输出目录(CopyToOutputDirectory)及发布目录(CopyToPublishDirectory),以及复制发生的条件。

四种模式:Never(默认,从不复制);PreserveNewest(源比目标新或目标缺失时复制,成本低);Always(每次构建无条件复制,成本高);IfDifferent(源与目标不同即复制,含源更新或更旧、大小不同或目标缺失,成本低)。IfDifferent 需 MSBuild 17.13+ / .NET SDK 9.0.2xx+ / VS 2022 17.13+,旧工具集不识别该值会导致项目被静默不复制。

用法(属性或子元素形式): <None Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" /> <None Include="testdata\seed.db"> <CopyToOutputDirectory>IfDifferent</CopyToOutputDirectory> </None>

为何少用 Always:它在无变更的增量构建中也会重新复制,大项目成本明显。历史上人们用 Always 处理目标文件会在构建间被改写(如 SQLite 数据库、状态文件、被测试修改的配置)的情况,因为 PreserveNewest 下目标时间戳更新后不会恢复源文件。IfDifferent 正是为此场景设计:内部用 Copy 任务并设 SkipUnchangedFiles="true",按时间戳与大小启发式判断(非内容哈希),目标被改为相同大小和时间戳时不重复制。

批量软化 Always:设 <SkipUnchangedFilesOnCopyAlways>true</SkipUnchangedFilesOnCopyAlways>,使 Always 项仅在确有差异时复制,默认 false。可在 Directory.Build.props 中启用;能逐项改为 IfDifferent 时优先改。

构建流程:GetCopyToOutputDirectoryItems 按值分桶,三个目标作为 _CopySourceItemsToOutputDirectory 依赖执行,复制文件登记进 FileWrites,dotnet clean 可清除。标记为 Always、PreserveNewest、IfDifferent 的项会通过 ProjectReference 传递到引用项目,Never 不会。

选择建议:运行时不需要选 Never;普通源文件选 PreserveNewest;目标会被改写需重置选 IfDifferent;确实每次都要新副本才用 Always(少见);遗留大量 Always 时设 SkipUnchangedFilesOnCopyAlways=true。

限制:IfDifferent 与 SkipUnchangedFilesOnCopyAlways 依赖新工具集;SkipUnchangedFiles 仅比较时间戳和大小,不比较内容哈希。