跨多个层的变更
在层之间切换
在初始化开发环境(详情请查看获取代码)步骤中,你已选择了一个层(layer)进行开发。该层的代码处于最新版本,而它下面的层则处于过去的某个历史版本中(译者注:类似于git中的submodule,子模块并不会直接更新到最新版本)。
如果你想切换到其他层,要么在代码树中获取更高层的源代码,要么当前查看的是更低层的的某个历史版本,对此你有两个选择:
- 采用和之前一样初始化的方式,为该层初始化新的开发环境。
- 通过
fx set-layer <layer>
命令切换现有的开发环境。该命令通过改变代码树jiri
元信息来指向新的层,并显示如何真正获取代码和构建新配置层的说明。
跨层的代码变更
因为Fuchsia被分成多层,每层看到的它下面的层其实是被固定到某个特定的历史版本,也就是说一个层更新后的代码并不会立即被上方的层看到。
当创建层的变更时,你需要考虑清楚在何时不同层会看到变更的不同部分,例如,当你想改变Zircon的接口,并且影响到Gernet的上层客户代码时,其他开发者在构建Gernet时并不会立刻看到Zircon的提交。相反,只有在Gernet更新了它指向Zricon的版本时才会看到这些更新。
软变换(推荐)
对于跨层变更的一种较好方式是使用软变换。在这种方式下,你提交到较低层(例如Zircon)的代码变更会同时支持新旧两种接口使用方式。例如,如果你想替换某个函数,你可以增加该函数的新版本,并用新版本来封装旧版本。
采用如下的步骤来进行软变换:
- 提交较低层层(例如Zircon)的代码变更,在不破坏上层(例如Garnet)使用的旧接口前提下,引入新的接口;
- 等待自动回滚bot更新上层指向的下层的版本号;
- 提交更改上层的代码,迁移到新的接口;
- 提交底层的变更,删掉旧接口。
硬变换
对于某些变更,创建软变换是非常困难或者根本不可行的,对此,你可以使用硬变换方式。在这种方式下,你创建破坏性变更来更新底层代码,并手动更新上层代码。
采用如下的步骤来进行硬变换:
- 上传底层(例如Zircon)破坏上层使用接口的变更。此时,自动回滚bot的更新上层操作将会失败;
- 上传上层的变更,迁移到新的接口,以及通过编辑上层的
//<layer>/manifest/<layer>
清单文件中底层的revision
属性来更新指向底层的版本号。
进行硬变换比软变换会产生更大的压力,因为在步骤1和步骤2之间将会阻止其他代码变更的发生。