2

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

描述

我目前已经lsyncd设置将项目文件镜像到远程 linux 机器上,我通过ENVVARS_HERE=$my_values cargo build. lsyncd不幸的是,使用rsyncw/archive flag似乎没有复制cargo用于确定文件是否已被编辑的任何属性:

我设置了一个工作区:

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

crateB取决于crateA. _ 此后,“远程机器”指的cargo是被调用的机器,“本地机器”指的是编辑代码lsyncd然后传递到“远程机器”的机器。我将使用“最近”来指代所描述的动作的依赖关系相对于以我知道的方式描述的状态没有改变的任何时间。

情况A

初始状态:

  • 工作空间已从本地机器复制到远程机器
  • lsyncd 没有在本地机器上运行
  • crateB最近cargo build在远程机器上编译

履行:

  • crateB在远程机器上编辑源文件
  • cargo build在远程机器上调用

结果:

  • crateBcargo在远程机器上重新编译

情况乙

初始状态:

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

履行:

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

结果:

  • crateA在远程机器上编译,然后crateB

笔记

  • lsyncd在有和没有archive = true的情况下运行(据我所知,它设置了 rsync 的archive标志来复制“大多数”元数据,其中“大多数”似乎错过了它cargo关心的任何内容),结果没有观察到变化。
  • 对存在的初始状态的编译针对lsyncd以下情况进行了测试,结果没有观察到变化:在初始阶段之前的编译和在初始阶段 之后lsyncd编译 lsyncd
  • lsyncd远程机器上的目标目录位于tmpfs文件系统上(如果这会产生一些神秘的差异)

问题

我想要一种方法来弄清楚这里发生了什么,无论是在这种情况下lsyncd还是将来如果/当我放弃lsyncd其他一些偶然发现类似问题的方法时。关于cargo例如 SO 的来源参考了时间戳的使用,但是时间戳有很多种,它们所指的时间戳是不清楚的。

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

4

1 回答 1

1

所以 cargo 使用指纹来跟踪更改元数据。

在我看来,从阅读与修改时间相关的代码来看mtime指纹::find_stale_file路径::mtime_recursive

于 2021-05-22T09:27:35.213 回答