跨多个层的变更


英文原文快照


在层之间切换

在初始化开发环境(详情请查看获取代码)步骤中,你已选择了一个层(layer)进行开发。该层的代码处于最新版本,而它下面的层则处于过去的某个历史版本中(译者注:类似于git中的submodule,子模块并不会直接更新到最新版本)。

如果你想切换到其他层,要么在代码树中获取更高层的源代码,要么当前查看的是更低层的的某个历史版本,对此你有两个选择:

  1. 采用和之前一样初始化的方式,为该层初始化新的开发环境
  2. 通过fx set-layer <layer>命令切换现有的开发环境。该命令通过改变代码树jiri元信息来指向新的层,并显示如何真正获取代码和构建新配置层的说明。

跨层的代码变更

因为Fuchsia被分成多,每层看到的它下面的层其实是被固定到某个特定的历史版本,也就是说一个层更新后的代码并不会立即被上方的层看到。

当创建层的变更时,你需要考虑清楚在何时不同层会看到变更的不同部分,例如,当你想改变Zircon的接口,并且影响到Gernet的上层客户代码时,其他开发者在构建Gernet时并不会立刻看到Zircon的提交。相反,只有在Gernet更新了它指向Zricon的版本时才会看到这些更新。

软变换(推荐)

对于跨层变更的一种较好方式是使用软变换。在这种方式下,你提交到较低层(例如Zircon)的代码变更会同时支持新旧两种接口使用方式。例如,如果你想替换某个函数,你可以增加该函数的新版本,并用新版本来封装旧版本。

采用如下的步骤来进行软变换:

  1. 提交较低层层(例如Zircon)的代码变更,在不破坏上层(例如Garnet)使用的旧接口前提下,引入新的接口;
  2. 等待自动回滚bot更新上层指向的下层的版本号;
  3. 提交更改上层的代码,迁移到新的接口;
  4. 提交底层的变更,删掉旧接口。

硬变换

对于某些变更,创建软变换是非常困难或者根本不可行的,对此,你可以使用硬变换方式。在这种方式下,你创建破坏性变更来更新底层代码,并手动更新上层代码。

采用如下的步骤来进行硬变换:

  1. 上传底层(例如Zircon)破坏上层使用接口的变更。此时,自动回滚bot的更新上层操作将会失败;
  2. 上传上层的变更,迁移到新的接口,以及通过编辑上层的//<layer>/manifest/<layer> 清单文件中底层的revision属性来更新指向底层的版本号。

进行硬变换比软变换会产生更大的压力,因为在步骤1和步骤2之间将会阻止其他代码变更的发生。