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

10
在我的.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>

但是,很难找到关于如何使用 PreserveNewest 的文档。我查看了各种Stackoverflow帖子,并在文档页面下找到了 None 元素的部分,其中说明如下:

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

  1. 从不
  2. 始终
  3. 保留最新的

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

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


这个回答解决了你的问题吗?为什么“复制到输出目录”选项的措辞在不同位置之间会改变? - Pavel Anikhouski
我猜仅在较新时复制保留最新的组合可以澄清一些问题。我可以做出一个有根据的猜测,即它只会在引用文件比已有文件更新时才进行复制。虽然我希望在文档中看到这一点,但不知道现在是否还需要花更多时间来了解它。 - ptf
2个回答

15

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

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

这意味着,如果您不希望目标目录中的文件更改(例如启动应用程序时修改的数据库文件),则最好选择PreserveNewest而不是选择Always,原因如下:

  • 需要少量磁盘IO以复制可能较大的文件
  • 如果将任何项目设置为Always,VS项目系统将不会将项目视为“已更新”-这意味着在VS中进行“构建”/“运行”将始终调用MSBuild,并且不会跳过已知未更改任何文件的项目。

3
请注意,您需要的一个选项 - CopyIfDifferent - 不存在。因此,如果您使用PreserveNewest并且例如回滚您的VCS历史记录,则可能会使用错误的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接