项目项元数据“PreserveNewest”实际上是如何工作的?

ptf*_*ptf 4 .net configuration csproj visual-studio

在我的 .csproj 文件中,我添加了以下配置:

<ItemGroup>
    <None Include="$(USERPROFILE)\.nuget\packages\microsoft.data.sqlclient.sni\1.0.19235.1\buildTransitive\net46\x64\SNI.dll">
        <!-- This is a workaround to include SNI.dll in the NuGet package resulting from the pipeline in Azure DevOps. -->
        <Link>x64\SNI.dll</Link>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

但是,很难找到有关PreserveNewest实际工作方式的文档。我查看了各种 Stackoverflow 帖子,并从文档中找到了此页面,该页面None元素部分下说明:

CopyToOutputDirectory 可选字符串。确定是否将文件复制到输出目录。值是:

  1. 绝不
  2. 总是
  3. 保存最新

它并没有真正描述它是如何工作的。有人知道吗?它根据什么标准来决定什么是最新的?文件更改日期?其他版本元数据?“保留”是什么意思?

配置的目的是将SNI.dll文件复制到bin/x64目录,它成功地完成了。

Mar*_*ich 5

它基于文件修改时间戳。即使查看负责的源代码也有点模糊,因为 MSBuild 使用目标的输入/输出来确定是否需要执行构建逻辑的一部分。

因此,如果您修改磁盘上的源文件,下一次 MSBuild 运行会将时间戳与输出目录中预期文件的时间戳进行比较,并且只有在目标文件丢失或具有相同或更新的修改日期时才会执行该逻辑.

这意味着最好选择PreserveNewest您是否不希望目标目录中的文件(例如,在应用程序启动时修改的数据库文件)中的文件发生变化,Always原因有两个:

  • 复制可能的大文件所需的磁盘 IO 更少
  • 如果 VS 项目系统将任何项目设置为“最新”,则它不会考虑项目Always- 这意味着 VS 中的“构建”/“运行”将始终调用 MSBuild,如果它知道没有文件已更改,则不会跳过项目。