如何在 GitLab EE 的基础上开发

前面说到极狐GitLab是基于 GitLab EE 进行开发的,所以所有的功能都是从 GitLab EE 上继承过去的,而极狐GitLab时常会需要开发自己的功能,而我们不希望通过覆盖的方式去新建一个同名文件来使得 jh/ 目录下文件得到加载,而是希望通过加载 ce/ 或者 ee/ 下的文件来加载 jh/ 目录下的文件,以保持与上游 GitLab 的功能同步,并且包含有极狐GitLab独有的功能。

方法

该方法我们简单可以理解为在上游通过特定的方式开辟入口,然后在 jh/ 中使用该入口。

要做到上述的行为,我们需要做的事情就是到上游 GitLab 上游仓库 的仓库中为极狐GitLab提供一个入口,例如在 _page.html.haml 模板文件中,我们通过在该文件中添加入口代码。

添加入口

在这我们会需要在 HAML 模板中用到一个 Ruby 里定义的一个比较重要的全局函数 render_if_exists,详细用法如下:

_page.html.haml

= render_if_exists "shared/footer/global_footer"

上游代码对应位置为 _page.html.haml,对应查看

该代码便会通过上下文查找对应的 views/ 文件夹来加载我们需要的这个 _global_footer.html.haml 模板文件,上面说到:

在极狐GitLab的仓库代码中,jh/ 目录下的文件的优先级顺序为 jh/ > ee/ > ce/。在这三个目录同时拥有某个文件时,所有 jh/ 目录下的文件都会优于其他目录下的文件加载。

  • 当极狐GitLab的应用运行时,通过优先加载 jh/ 目录下的 _global_footer.html.haml 这个模板文件来渲染应用,从而达到功能定制的效果。

  • 当上游应用独立运行时,上游应用并没有 jh/ 这个目录,那么上游应用将会优先加载 ee/ 目录下的 _global_footer.html.haml 文件,假如 ee/ 下找不到该文件,则会去加载 ce/ 下的该同名文件,如果 ce/ 目录下也没有当前文件,则该方法不会有任何副作用。

使用入口

通过在对应的 jh/ 目录下添加 jh/app/views/shared/footer/_global_footer.html.haml 文件,然后添加需要渲染的内容。

该示例代码可以在 _global_footer.html.haml 查看到。