货物如何准确检测文件更改?

时间:2019-12-02 21:57:27

标签: rust-cargo lsyncd

tl; dr:我想知道cargo用于确定文件是否已更改以调试在构建系统设置程序中观察到的问题。

说明

我目前有lsyncd设置,可以将项目文件镜像到远程Linux机器上,在那里我可以通过ENVVARS_HERE=$my_values cargo build编译代码。不幸的是,lsyncdrsync一起使用archive flag似乎并没有复制cargo用于确定文件是否已被编辑的任何属性:

我设置了一个工作区:

workspace
+ crateA
  + ...
+ crateB
  + ...

其中crateB取决于crateA。从此以后,“远程计算机”是指在其上调用cargo的计算机,而“本地计算机”是指编辑lsyncd然后传递到“远程计算机”的代码的计算机。我将使用“最近”来指的是在任何时候相对于所描述的状态,所描述的动作的依存关系都没有发生变化。

情况A

初始状态:

  • 工作区已从本地计算机复制到远程计算机
  • lsyncd 在本地计算机上运行
  • crateB最近由cargo build在远程计算机上编译了

执行:

  • 在远程计算机上的crateB中编辑源文件
  • 在远程计算机上调用cargo build

结果:

  • crateB由远程计算机上的cargo重新编译

情况B

初始状态:

  • 工作区已从本地计算机复制到远程计算机
  • lsyncd 在本地计算机上运行(请参阅以下有关配置的注释)
  • crateB最近由远程机器上的cargo build进行了编译(请参阅有关与lsyncd的操作模式有关的时序的注释)

执行:

  • 在本地计算机上编辑crateB文件
  • 等待同步触发并完成
  • 在远程计算机上调用cargo build

结果:

  • crateA在远程计算机上编译,随后是crateB

注释

  • lsyncd在有和没有archive = true的情况下运行(据我所知,rsync的archive标志设置为复制“最多”的元数据,其中“最多”似乎丢失了任何内容cargo很在意),而结果没有观察到变化。
  • 在以下情况下测试了{li>存在lsyncd的初始状态的
  • 编译,结果没有观察到变化:编译之前 lsyncd的初始通过,以及编译 lsyncd的初始通行证
  • 远程计算机上lsyncd的目标目录位于tmpfs文件系统上(如果这会造成一些不可思议的变化)

问题

无论是在这种情况下,lsyncd还是将来(如果/当我放弃lsyncd放弃其他偶然发现类似方法的方法时,我都想知道这里发生的事情问题。有关cargo的来源,例如SO引用了时间戳的用法,但是时间戳有很多种,它们所引用的时间戳还不清楚。

cargo在确定文件是否已更改时究竟要检查什么

1 个答案:

答案 0 :(得分:0)

因此,cargo 使用 fingerprints 来跟踪更改元数据。

在我看来,它与mtime(修改时间)相关的代码; fingerprint::find_stale_filepaths::mtime_recursive